From e7436275ddd9657fe611853599ccc9504e4e005b Mon Sep 17 00:00:00 2001 From: Simple Analytics Codex Date: Sun, 27 Sep 2026 21:16:49 +0300 Subject: [PATCH 1/9] Support server page-load IDs in v12 tracking scripts --- dist/latest/auto-events.js | 2 +- dist/latest/cloudflare.js | 28 +- dist/latest/custom/app.js | 4 +- dist/latest/custom/app.js.map | 2 +- dist/latest/custom/auto-events.js | 2 +- dist/latest/custom/e.js | 4 +- dist/latest/custom/e.js.map | 2 +- dist/latest/custom/latest.dev.js | 28 +- dist/latest/custom/latest.js | 4 +- dist/latest/custom/latest.js.map | 2 +- dist/latest/custom/light.js | 4 +- dist/latest/custom/light.js.map | 2 +- dist/latest/custom/proxy.js | 4 +- dist/latest/custom/proxy.js.map | 2 +- dist/latest/hello.js | 4 +- dist/latest/hello.js.map | 2 +- dist/latest/latest.dev.js | 28 +- dist/latest/latest.js | 4 +- dist/latest/latest.js.map | 2 +- dist/latest/light.js | 4 +- dist/latest/light.js.map | 2 +- dist/v12/app.js | 4 +- dist/v12/app.js.map | 2 +- dist/v12/auto-events.js | 2 +- dist/v12/custom/app.js | 4 +- dist/v12/custom/app.js.map | 2 +- dist/v12/custom/auto-events.js | 2 +- dist/v12/custom/light.js | 4 +- dist/v12/custom/light.js.map | 2 +- dist/v12/custom/proxy.js | 4 +- dist/v12/custom/proxy.js.map | 2 +- dist/v12/light.js | 4 +- dist/v12/light.js.map | 2 +- package.json | 17 +- pnpm-lock.yaml | 3451 ++++++++--------------------- pnpm-workspace.yaml | 16 +- src/default.js | 26 +- test/helpers/get-browsers.js | 29 +- test/unit/page-load-id.test.js | 109 + 39 files changed, 1183 insertions(+), 2635 deletions(-) create mode 100644 test/unit/page-load-id.test.js diff --git a/dist/latest/auto-events.js b/dist/latest/auto-events.js index d48601d..1fdf6a5 100644 --- a/dist/latest/auto-events.js +++ b/dist/latest/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; e658; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; e658; v12) */ function r(t,e){var n,o;t.hasAttribute("data-simple-event")||(n=!1,b.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(b.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?n="download":b.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==h.location.hostname?n="outbound":b.emails&&/^mailto:/i.test(t.href)?n="email":b.phones&&/^tel:/i.test(t.href)&&(n="phone"),n&&(e?(o="saAutomatedLink(this, '"+n+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(o+=" return false;"),t.setAttribute("onclick",o)):t.addEventListener("click",function(){g(this,n)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!it(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(h,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/latest/custom/app.js.map b/dist/latest/custom/app.js.map index d49fd42..0cdc760 100644 --- a/dist/latest/custom/app.js.map +++ b/dist/latest/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/auto-events.js b/dist/latest/custom/auto-events.js index d48601d..1fdf6a5 100644 --- a/dist/latest/custom/auto-events.js +++ b/dist/latest/custom/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; e658; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; e658; v12) */ function r(t,e){var n,o;t.hasAttribute("data-simple-event")||(n=!1,b.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(b.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?n="download":b.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==h.location.hostname?n="outbound":b.emails&&/^mailto:/i.test(t.href)?n="email":b.phones&&/^tel:/i.test(t.href)&&(n="phone"),n&&(e?(o="saAutomatedLink(this, '"+n+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(o+=" return false;"),t.setAttribute("onclick",o)):t.addEventListener("click",function(){g(this,n)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!it(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,f=w.userAgent,p="Not sending request ",d=p+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,ft=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); //# sourceMappingURL=e.js.map \ No newline at end of file diff --git a/dist/latest/custom/e.js.map b/dist/latest/custom/e.js.map index 7d67aee..96896da 100644 --- a/dist/latest/custom/e.js.map +++ b/dist/latest/custom/e.js.map @@ -1 +1 @@ -{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/latest.dev.js b/dist/latest/custom/latest.dev.js index 8dc894a..c4296cd 100644 --- a/dist/latest/custom/latest.dev.js +++ b/dist/latest/custom/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 3665; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 2aa6; v12) */ /* eslint-env browser */ (function ( @@ -142,6 +142,18 @@ if (logSettings) warn("Settings", overwriteOptions); + // A server-created initial pageview can be enriched by this script. + var pageLoadId = + overwriteOptions.pageLoadId || attr(scriptElement, "page-load-id"); + if ( + typeof pageLoadId !== "string" || + !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test( + pageLoadId + ) + ) { + pageLoadId = undefinedVar; + } + // Customers can skip data points var ignoreMetrics = convertCommaSeparatedToArray( overwriteOptions.ignoreMetrics || attr(scriptElement, "ignore-metrics") @@ -470,10 +482,13 @@ https: loc.protocol == https, timezone: timezone, - page_id: collectDataOnLeave ? uuid() : undefinedVar, + collected_client_side: trueVar, + page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar), // se = sessions - session_id: collectMetricByString("se") ? uuid() : undefinedVar, + session_id: collectMetricByString("se") + ? pageLoadId || uuid() + : undefinedVar, }); payload.sri = falseVar; @@ -680,7 +695,9 @@ callback ) { if (isPushState) sendOnLeave("" + payload.page_id, trueVar); - if (collectDataOnLeave) payload.page_id = uuid(); + var originalId = pages === 0 ? pageLoadId : undefinedVar; + payload.page_id = + originalId || (collectDataOnLeave ? uuid() : undefinedVar); var currentPage = definedHostname + getPath(); var query = getQueryParams(deleteSourceInfo, search); @@ -688,7 +705,8 @@ sendData( { id: payload.page_id, - type: pageviewText, + original_id: originalId, + type: originalId ? "append" : pageviewText, referrer: !deleteSourceInfo || sameSite ? referrer : null, query: query, k: k, diff --git a/dist/latest/custom/latest.js b/dist/latest/custom/latest.js index f331c1b..7c13732 100644 --- a/dist/latest/custom/latest.js +++ b/dist/latest/custom/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 2fea; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; d8a8; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!it(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(h,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,f=w.userAgent,p="Not sending request ",d=p+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,ft=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); //# sourceMappingURL=latest.js.map \ No newline at end of file diff --git a/dist/latest/custom/latest.js.map b/dist/latest/custom/latest.js.map index e2232a8..706be44 100644 --- a/dist/latest/custom/latest.js.map +++ b/dist/latest/custom/latest.js.map @@ -1 +1 @@ -{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/light.js b/dist/latest/custom/light.js index f32008e..2b15e0c 100644 --- a/dist/latest/custom/light.js +++ b/dist/latest/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 1b6a; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 3557; v12) */ -!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,i="doNotTrack",m=l.navigator,p=l.location,g=p.host,a=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,d=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(a.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),x=a.currentScript||a.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},i=arguments,a=0;a>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,H=function(t,e,n){t=n?t:$(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},T=e.hostname||A(x,"hostname"),F=T||g,z={version:"custom_light_12",hostname:F};e.mode||A(x,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=$(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!1,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),F!==g&&(J.hostname_original=g),i in m&&"1"==m[i])return f("Not sending request when "+i+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||T||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||A(x,"referrer")||a.referrer||"").replace(g,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=$(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)H(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){H(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,i,a){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=F+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var i,a;N(r);E(t)&&-1"); +!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,d=l.location,g=d.host,i=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,p=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,x=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var $=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},I=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||A(E,V)||"sa",C=e.strictUtm||"true"==A(E,"strict-utm"),H=B+"_loaded";if(1==l[H])return f(c+"twice");l.sa_event_loaded=!0,l[H]=!0;var T,F=function(t,e,n){t=n?t:I(M,Z,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||A(E,"hostname"),z=L||g,J={version:"custom_light_12",hostname:z};e.mode||A(E,"mode");try{T=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}x&&(J.bot=!0);var M=I(J,{ua:o,https:d.protocol==n,timezone:T,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!1,w&&(M.mobile=w.mobile,M.brands=v(w.brands)),z!==g&&(M.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||L||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||A(E,"referrer")||i.referrer||"").replace(g,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,K=function(e,t){var n=I(J,{type:"append",original_id:t?e:M.page_id});if(t||!m.sendBeacon)F(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){F(n,0,!0)}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:u;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||u);F({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);$(t)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/latest/custom/light.js.map b/dist/latest/custom/light.js.map index a65fce3..f214dd4 100644 --- a/dist/latest/custom/light.js.map +++ b/dist/latest/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/proxy.js b/dist/latest/custom/proxy.js index 67ce58b..1ae250f 100644 --- a/dist/latest/custom/proxy.js +++ b/dist/latest/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 3faa; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; ef42; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!it(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(h,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",I="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/latest/custom/proxy.js.map b/dist/latest/custom/proxy.js.map index f859b43..e909212 100644 --- a/dist/latest/custom/proxy.js.map +++ b/dist/latest/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/hello.js b/dist/latest/hello.js index b9dc364..86bda97 100644 --- a/dist/latest/hello.js +++ b/dist/latest/hello.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; e718) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 95aa) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,q="https://queue."+e,M=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[qt];if(!it(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[Mt];if(!ot(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"hello.source.js","sources":["hello.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAAaC,iBAA0BpC,EACvCqC,EAAkBhB,EAAIgB,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAAS1B,EAAI2B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK7B,KAAe,WAAW6B,KAAK7B,GACxD8B,EAASvD,EAAOuD,OAIhBC,EACFjC,EAAIkC,eAAiBlC,EAAImC,cAAc,gBAAkBxD,EAAU,MAOrEE,EAAO,WAEL,IAAIuD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK/C,EAAIV,KAAMU,EAAK6C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnCjE,EAAK,iBAAmBgE,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWlG,EAAOmG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKpG,GAAkBsF,OAG5DtF,EAAmB2F,EAAO3F,EAAkBiG,GAExCE,GAAahG,EAAK,WAAYH,GAGlC,IAAIqG,GACFrG,EAAiBqG,YAActB,EAAKxB,EAAe,gBAE7B,iBAAf8C,IACN,yEAAyEhD,KACxEgD,MAGFA,GAAajG,GAIf,IA+EIkG,GA/EAC,GAAgBrB,EAClBlF,EAAiBuG,eAAiBxB,EAAKxB,EAAe,mBAGpDiD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU7B,GAC7B,OAAO,IAAI8B,OAAO,IAAMF,GAAoBpD,KAAKwB,KAChDS,QAIHsB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAehH,EAAOiH,QAAUjH,EAAOkH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOnD,GACP,OAAO8C,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF9H,EAAiB6H,KACjB9C,EAAKxB,EAAesE,KAuyBxB,KApyBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBnI,EAAO+H,GAAY,aACpCtC,EAAS0C,KAAiBF,EAAWrC,EAAOqC,EAAUE,IAC1D,IAAIC,EAA4BpI,EAAOqI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACFjI,EACEiI,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOrC,EACLqC,EACAG,EAA0BvE,KAAK7D,EAAQ4F,EAAOqC,EAAUC,KAE1D,MAAO7D,GACPF,EAAe,WAAYE,KAU3BiE,GACFrI,EAAiBqI,WACjBtD,EAAKxB,EAAe,eAAiB/C,EAInC8H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAKjG,EACvD,IAAIkI,GAAKD,GAAmBtH,EAAIwH,QAC7B/E,MAAM,GACN4B,MAAM,KACNmB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM/F,GAAgB,EAAJqI,GAASD,EAAShF,MAAMiF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAShF,MAAM,EAAGiF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIrE,GAAasE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAY1D,OAAe/E,EAInC,IAAIoG,OAAOwC,EAAO,KAAK9F,KAAKsF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKlG,EACFqI,GAAKrI,GA+BVgJ,GAAiBtB,GAAY,UACjC,GAAI/H,EAAOqJ,KAAmB9I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOsJ,gBAAkB/I,EACzBP,EAAOqJ,IAAkB9I,EAOzB,IAAIgJ,GAAW,SAAUrB,EAAMsB,EAAUC,GACvCvB,EAAOuB,EAAevB,EAAOtC,EAAO8D,GAASC,GAAMzB,GAE/CjH,EAAI2I,QAAUH,IAAcvB,EAAK0B,MAAQrJ,GACzCU,EAAI4I,qBAAuBJ,IAAcvB,EAAK4B,KAAOvJ,GAGzD,IAAIwJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJ9H,EACA,eACAoC,OAAO4B,KAAK6B,GACTvB,OAAO,SAAUyD,GAChB,OAAOlC,EAAKkC,IAAQ/J,IAErB6I,IAAI,SAAUkB,GACb,OACEvI,EAAuBuI,GACvB,IACAvI,EAAuBqG,EAAKkC,MAG/BjB,KAAK,KACR,SACArC,KAAKD,OAILwD,GACFpK,EAAiBqK,UAAYtF,EAAKxB,EAAe,YAC/C+G,GAAkBF,IAAuBhJ,EAEzCmJ,GAAc,CAChBC,QAqpBJ,eAppBIH,SAAUC,IASZpK,EAAY,SAAUuK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJtK,EAAKsK,GACLnB,GACE3D,EAAO4E,GAAa,CAClBI,KAAM/J,EACNwD,MAAOqG,EACPG,KAAM1J,EAAI2J,WAEZzK,EACAE,IAMJ4B,EACEtB,EACA,SAAUkK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASlC,QAAQ5I,IAC3CC,EAAU4K,EAAME,UAGpBzK,GAOF,IAwDI0K,GAxDAC,GAAQtE,KAERuE,GAAW,EAOXC,GAAOpL,EAAiBoL,MAAQrG,EAAKxB,EAAe,QAGpD8H,MA/KsBC,GA+KCtL,EAAiBqL,cA9KvBC,GA+KjBtL,EAAiBqL,WACjBtG,EAAKxB,EAAe,eAAiB/C,GACrCuE,EAAKxB,EAAe,aAAe/C,GACnCuE,EAAKxB,EAAe,gBAAkB/C,EAGtC+K,KACqC,SAAvCxG,EAAKxB,EAAe,iBACpBvD,EAAiBuL,cAAgBhL,GAI/BiL,GACFxL,EAAiByL,UACjB1G,EAAKxB,EAAe,cACpBuE,GAAY,IAAMnH,EAGhB+K,GAAcxG,EAChBlF,EAAiB0L,aAAe3G,EAAKxB,EAAe,iBAIlDyF,GAAc9D,EAChBlF,EAAiBgJ,aAAejE,EAAKxB,EAAe,iBAIlDoI,GAAqBzG,EACvBlF,EAAiB2L,oBACf5G,EAAKxB,EAAe,yBAIpBqI,GACF5L,EAAiB4L,gBAAkB7G,EAAKxB,EAAe,mBAGrD6E,GACFpI,EAAiBoI,mBACjBrD,EAAKxB,EAAe,sBAItB,IAEE0H,GAAWzE,GAAsB,KAC7BqF,KAAKC,iBAAiBC,kBAAkBC,SACxC5L,EACJ,MAAOgE,IACPjE,EAAKiE,IAOP,IAAI6H,GAAUlM,EAAOkM,QACjBC,GACFlL,EAAImL,WACJpM,EAAOqM,aACPrM,EAAOsM,aACPtM,EAAOuM,UACNL,KAAYA,GAAQM,QACrBxM,EAAOyM,YACPzM,EAAO0M,MACPrJ,GACAqE,KAAKC,UAAYD,KAAKC,SAGpBgF,GACFlG,GAAsB,MAAQA,GAAsB,QAElD0F,KAAK3B,GAAY2B,IAAM5L,GAE3B,IAAImJ,GAAU9D,EAAO4E,GAAa,CAEhCoC,GAAInG,GAAsB,MAAQhF,EAAYpB,EAE9CK,MAAOS,EAAImB,UAAY5B,EACvBwK,SAAUA,GACV2B,sBAAuBtM,EACvBuM,QAASxG,KAAeqG,GAAqB5F,KAAS1G,GAGtD0M,WAAYtG,GAAsB,MAC9BH,IAAcS,KACd1G,IA0BN,GAvBAqJ,GAAQsD,IAAMxM,EAIVmC,IACF+G,GAAQuD,OAAStK,EAAOsK,OACxBvD,GAAQwD,OAASjL,EAAUU,EAAOuK,SAS/B3L,EAAI4L,SAAS/M,EAAK,4CAInBmK,KAAoBlJ,IACtBqI,GAAQ0D,kBAAoB/L,IAGzBiK,IAActK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBmC,EAAU,SAK7B,GAAlC9B,EAAiByH,QAAQ,OACxB,aAAaxF,KAAKjC,IACnBgJ,IAEDjK,EACE,mBACEiB,EACA,SACA8B,EACA,0BAON,IACIkK,GA0DAC,GA3DA3D,GAAO,GAGP4D,GAAc,WAKhB,OAFEtN,EAAiBuN,UAAYxI,EAAKxB,EAAe,aAGzBjC,EAAIiM,UAAY,IACrCzI,QAAQ1D,EAAkBkJ,IAC1BxF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS1E,GAKjCmN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKjB,GAAL,CAEA,IAAIkB,EAASjI,EAAO4E,GAAa,CAC/BI,KAAM,SACNkD,YAAaF,EAAOD,EAAKjE,GAAQoD,UAenC,GAXIrG,GAAsB,OACxBoH,EAAOE,SAAWrG,KAAKsG,OAAOnH,KAAQsE,GAAQsC,IAlhBnC,MAohBbA,GAAW,EACXtC,GAAQtE,KAGJJ,GAAsB,UACxBoH,EAAOzC,SAAW1D,KAAKuG,IAAI,EAAG7C,GAAU8C,OAGtCN,IAAS3M,EAAIkN,WAEf5E,GAASsE,EAAQxN,EAAcE,QAE/B,IACEU,EAAIkN,WAAWC,KAAKnN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU4L,IAC3D,MAAOQ,GAEP9E,GAASsE,EAAQxN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAI+M,QACA,KAAOtL,KAAYhD,GAAS0N,KAClCJ,GAAczG,MACT4G,IAAY5G,KAAQyG,IAE7B9M,GAGF2B,EAAqBa,EAAU0K,GAAalN,GAE5C,IAAI+N,GAAOhN,EAAIgN,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuBjM,EAAgBQ,IAAiB,EACxD0L,EAAS/G,KAAKuG,IAChBM,GAAK1L,IAAiB,EACtB0L,GAAKzL,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO4E,KAAKgH,IACV,IAKI,EAJJhH,KAAKsG,MACF,MAAQzL,EAAgBoM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOpK,IAEP,OADAjE,EAAKiE,IACE,IAIXlC,EAAqB,OAAQ,WAC3BiJ,GAAW8C,KACX/L,EACEO,EACA,WACM0I,GAAW8C,OAAY9C,GAAW8C,OAExC1N,KAQJ,IAgCIoO,GAuCAC,GAAUC,GAvEVC,GAAU,SAAUC,GACtB,IAAInE,EAAO,GAIX,IACEA,EAAOmE,GAAajN,EAAuBZ,EAAI2J,UAC/C,MAAOzG,IACPjE,EAAKiE,IAGP,IAAI4K,EAAyBjP,EAAO6L,IACpC,GAAIjE,GAAWqH,GACb,IACEpE,EAAOoE,EAAuBpL,KAAK7D,EAAQ,CAAE6K,KAAMA,KAAWA,EAC9D,MAAOxG,IACPF,EAAe,OAAQE,IAK3B,IA/YiB,SAAUwG,GAC3B,IAAK,IAAIhC,KAAK8C,GAAa,CACzB,IAAIuD,EAAgBvD,GAAY9C,GAChC,GAAKqG,EAAL,CAGA,IAAIC,EA1PI,KA2PND,EAAc,GAAcA,EA3PtB,IA2P8CA,EAEtD,GACEC,IAAetE,GACf,IAAIjE,OACF,IAAM/B,EAAYsK,GAAYpK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKuH,GAEP,OAAOtK,GAEX,OAAOC,EA6XH4O,CAAavE,GAQjB,MAFY,QAARQ,IAAkBlK,EAAIkO,OAAMxE,GAAQ1J,EAAIkO,KAAK7J,MAAM,KAAK,IAErDqF,EAPLzK,EAAKuB,EAAiB,YAAckJ,IAmDpCyE,GAAW,SACbC,EACAC,EACAvH,EACAwH,IAEKA,GAAe7H,GAAWK,KAAWwH,EAAcxH,GACxD,IACIyH,EAGEC,EAJFnG,EAAW5B,GAAW6H,GAAeA,EAAc,aAEnD9K,EAAS6K,KAAgD,EAA9BA,EAAc1G,QAAQ,OAGnD0G,GADIG,EAAQH,EAAchK,MAAM,MACVoK,QACtBF,EAAc,IAAMC,EAAMxG,KAAK,MAGjC,IAAI0B,EAAOkE,GAAQS,GAGnB,GAAK3E,GAAQwC,IAAgBxC,EAA7B,CAEAwC,GAAexC,EACflB,GAAKkB,KAAOA,EAGRpE,GAAsB,OACxBkD,GAAKkG,eACHnI,KAAKuG,IAAI1L,EAA2B,aAAK,EAAGvC,EAAO8P,YAAc,IACjE,KACFnG,GAAKoG,gBACHrI,KAAKuG,IACH1L,EAAgBQ,IAAiB,EACjC/C,EAAOgQ,aAAe,IACnB,MAILvJ,GAAsB,MACpBxF,EAAIuB,KAAWmH,GAAKnH,GAAYvB,EAAIuB,IAItCe,GAAUkD,GAAsB,QAClCkD,GAAKsG,aAAe1M,EAAO2M,MAC3BvG,GAAKwG,cAAgB5M,EAAOkL,QAI9B,IAII2B,EAJAC,EAAOrQ,EAAOsQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG3F,KAC/D,MAAOvG,IACPjE,EAAKiE,IAGPyK,GAAgBsB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBtH,QAAQsH,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGzH,QAAQuH,EAAKE,GAAgB3F,MAGxC,IAAI6F,EAA0BjD,GAC1BA,GAAShI,MA5vBH,KA4vBgB,GACtBnF,EACJwO,GAAWrB,IACgD,EAAvD5B,GAAmB9C,QAAQ2H,IAC3BA,GAA2BpP,EAC3Bb,EAGJmJ,GAAK+G,OACH,QAAQpN,KAAKiK,OAAkBgC,GAAeT,GAC1CtO,GACCqO,GAEP5G,EAAWD,GAAeC,EAAU,CAClC2C,KAAMjK,EACNkK,KAAMlB,GAAKkB,OAGb,IAAI8F,EAAsB,WACxB/O,EAA2BrB,EAC3B,IAAIqQ,EACFrB,GAAeT,KAAkBrI,GAAsB,MAhI1C,SACjB8I,EACAsB,EACAhC,EACAlG,EACAV,EACAuB,GAEI+F,GAAa7B,GAAY,GAAKhE,GAAQoD,QAASvM,GACnD,IAAIuQ,EAAuB,IAAV1N,EAAckD,GAAajG,EAC5CqJ,GAAQoD,QACNgE,IAAenE,GAAqB5F,KAAS1G,GAE/C,IAAI0Q,EAAcxG,GAAkBwE,KAChCiC,EAAQzI,GAAesI,EAAkBlI,GAE7CY,GACE,CACEoE,GAAIjE,GAAQoD,QACZgB,YAAagD,EACblG,KAAMkG,EAAa,SAAWnQ,EAC9B6M,UAAWqD,GAAoBhC,EAAWrB,GAAW,KACrDwD,MAAOA,EACPzK,EAAGA,GAEH0B,SAAUhG,EAAUgG,IAEtBuB,GAGFoF,GAAmBpB,GACnBA,GAAWuD,EAEX3N,IAgGE6N,CACE1B,EACAqB,EACA/B,GACAa,EACAzH,EACAuB,IAIJ,GAAK5H,EAmBH+O,SAjBA,IACMhO,GAAUiF,GAAWjF,EAAOuO,sBAC9BvO,EACGuO,qBAAqB,CAACjO,EAAcC,IACpCiO,KAAK,SAAUC,GACd1H,GAAQ2H,QAAUD,EAAkBnO,GACpCyG,GAAQ4H,WAAaF,EAAkBlO,GACvCyN,MAEDY,SAAMZ,GAETA,IAEF,MAAOtC,GACPsC,OAWFa,GAAMxR,EAAOyR,QACbC,GAAeF,GAAMA,GAAIG,UAAYtR,EACrCuR,GAAM5R,EAAO6R,cACbC,GAAgB,YAIhBtG,IAAekG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB5G,GAoBAkH,IAlBrB,WACL,IAEI/G,EAFAjF,EAAMhC,UACNmO,EAAKD,GAAK9N,MAAMgO,KAAMpM,GAY1B,OAVI8B,GAAWmK,OACbhH,EAAQ,IAAIgH,MAAMnH,KAIlBG,EAAQxJ,EAAI4Q,YAAY,UAClBC,UAAUxH,GAAMrK,EAASA,GAEjCwK,EAAMjH,UAAYgC,EAClB8L,GAAI7G,GACGkH,IAMX9P,EACE2P,GACA,WACExC,GAAS,IAEX9O,GAGF2B,EACE,WACA,WACEmN,GAAS,IAEX9O,IAKAgL,IAAuB,QAARH,IAAkB,iBAAkBrL,GACrDmC,EACE,aACA,WACEmN,GAAS,IAEX9O,GAIAgL,IAAa8D,KAEjBtP,EAAOqS,YAAc,SAAUxH,EAAM5C,EAAUuB,GAC7C8F,GAAS,EAAGzE,EAAM5C,EAAUuB,IAQ9B,IAAI8I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUxH,EAAO9C,EAAUwH,IACpCA,GAAe7H,GAAWK,KAAWwH,EAAcxH,GAExD,IAAIuK,EAAkB5K,GAAWmD,GAC7BvB,EAAW5B,GAAW6H,GAAeA,EAAc,aACnDgD,SAAmB1H,EAEvB,GAAIuH,GAAWxJ,QAAQ2J,GAAa,IAAMD,EAExC,OADArO,EAAesH,GAAmB7K,EAAY,aAAe6R,GACtDjJ,IAGT,IACE,GAAIgJ,EAAiB,CACnB,IAAIE,EAAc3H,IAClB,GAAIuH,GAAWxJ,eAAe4J,GAAe,EAK3C,OAJAvO,EACEsH,GACAV,EAAQ,uBAAyB2H,GAE5BlJ,IAETuB,EAAQ2H,GAEV,MAAOrO,IAEP,OADAF,EAAesH,GAAmBpH,IAC3BmF,IAGTuB,GAAS,GAAKA,GAAOhG,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAI4N,EAAc,CAAE/H,KAAMhK,EAAWmK,MAAOA,GACxC6H,GAAa9D,IAAiB1L,EAAQ,EAE1C6E,EAAWD,GAAeC,EAAU0K,GAEhC5H,GACFxB,GACE3D,EAAO+M,EAAa,CAClBhF,GAAI5G,KACJiK,MAAOzI,IAAgBqK,GACvBpF,UACGoF,GAAa/D,KAAapI,GAAsB,KAC7CmI,GACA,KAEN3G,SAAUhG,EAAUgG,KAEtBuB,IAKFqJ,GAAmB,SAAU9H,EAAO9C,EAAUuB,GAChD+I,GAAUxH,EAAO9C,EAAUuB,IAIxBxJ,EAAOyL,MACVzL,EAAOyL,IAAqBoH,IAE9B,IAAIC,GAAY9S,EAAOyL,IAGnBsH,GAAQD,IAAaA,GAAUpK,EAAIoK,GAAUpK,EAAI,GAMrD,IAAK,IAAIqC,MAHT/K,EAAOyL,IAAqBoH,GAGVE,GACZzO,EAAQyO,GAAOhI,MACjB1F,MAAMC,QAAQyN,GAAMhI,KAChBwH,GAAUrO,MAAM,KAAM6O,GAAMhI,KAC5BwH,GAAUQ,GAAMhI,MAGxB,MAAOsD,IACPlO,EAAUkO,IA7IY,IAAUzD,GACxBoH,GA3nBkBzG,GA/N9B,CAy+BEvL,OACA,uBACA"} \ No newline at end of file diff --git a/dist/latest/latest.dev.js b/dist/latest/latest.dev.js index 57f7f5d..47e2469 100644 --- a/dist/latest/latest.dev.js +++ b/dist/latest/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 4ae9; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; ea66; v12) */ /* eslint-env browser */ (function ( @@ -142,6 +142,18 @@ if (logSettings) warn("Settings", overwriteOptions); + // A server-created initial pageview can be enriched by this script. + var pageLoadId = + overwriteOptions.pageLoadId || attr(scriptElement, "page-load-id"); + if ( + typeof pageLoadId !== "string" || + !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test( + pageLoadId + ) + ) { + pageLoadId = undefinedVar; + } + // Customers can skip data points var ignoreMetrics = convertCommaSeparatedToArray( overwriteOptions.ignoreMetrics || attr(scriptElement, "ignore-metrics") @@ -470,10 +482,13 @@ https: loc.protocol == https, timezone: timezone, - page_id: collectDataOnLeave ? uuid() : undefinedVar, + collected_client_side: trueVar, + page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar), // se = sessions - session_id: collectMetricByString("se") ? uuid() : undefinedVar, + session_id: collectMetricByString("se") + ? pageLoadId || uuid() + : undefinedVar, }); payload.sri = falseVar; @@ -680,7 +695,9 @@ callback ) { if (isPushState) sendOnLeave("" + payload.page_id, trueVar); - if (collectDataOnLeave) payload.page_id = uuid(); + var originalId = pages === 0 ? pageLoadId : undefinedVar; + payload.page_id = + originalId || (collectDataOnLeave ? uuid() : undefinedVar); var currentPage = definedHostname + getPath(); var query = getQueryParams(deleteSourceInfo, search); @@ -688,7 +705,8 @@ sendData( { id: payload.page_id, - type: pageviewText, + original_id: originalId, + type: originalId ? "append" : pageviewText, referrer: !deleteSourceInfo || sameSite ? referrer : null, query: query, k: k, diff --git a/dist/latest/latest.js b/dist/latest/latest.js index d4e8c8e..ada1e7d 100644 --- a/dist/latest/latest.js +++ b/dist/latest/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; dbab; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 4172; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,q="https://queue."+e,M=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[qt];if(!it(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[Mt];if(!ot(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAAaC,iBAA0BpC,EACvCqC,EAAkBhB,EAAIgB,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAAS1B,EAAI2B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK7B,KAAe,WAAW6B,KAAK7B,GACxD8B,EAASvD,EAAOuD,OAIhBC,EACFjC,EAAIkC,eAAiBlC,EAAImC,cAAc,gBAAkBxD,EAAU,MAOrEE,EAAO,WAEL,IAAIuD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK/C,EAAIV,KAAMU,EAAK6C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnCjE,EAAK,iBAAmBgE,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWlG,EAAOmG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKpG,GAAkBsF,OAG5DtF,EAAmB2F,EAAO3F,EAAkBiG,GAExCE,GAAahG,EAAK,WAAYH,GAGlC,IA+EIqG,GA/EAC,GAAgBpB,EAClBlF,EAAiBsG,eAAiBvB,EAAKxB,EAAe,mBAGpDgD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU5B,GAC7B,OAAO,IAAI6B,OAAO,IAAMF,GAAoBnD,KAAKwB,KAChDS,QAIHqB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe/G,EAAOgH,QAAUhH,EAAOiH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOlD,GACP,OAAO6C,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF7H,EAAiB4H,KACjB7C,EAAKxB,EAAeqE,KAiyBxB,KA9xBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBlI,EAAO8H,GAAY,aACpCrC,EAASyC,KAAiBF,EAAWpC,EAAOoC,EAAUE,IAC1D,IAAIC,EAA4BnI,EAAOoI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACFhI,EACEgI,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOpC,EACLoC,EACAG,EAA0BtE,KAAK7D,EAAQ4F,EAAOoC,EAAUC,KAE1D,MAAO5D,GACPF,EAAe,WAAYE,KAU3BgE,GACFpI,EAAiBoI,WACjBrD,EAAKxB,EAAe,eAAiB/C,EAInC6H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAKhG,EACvD,IAAIiI,GAAKD,GAAmBrH,EAAIuH,QAC7B9E,MAAM,GACN4B,MAAM,KACNkB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM9F,GAAgB,EAAJoI,GAASD,EAAS/E,MAAMgF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAS/E,MAAM,EAAGgF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIpE,GAAaqE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAYzD,OAAe/E,EAInC,IAAImG,OAAOwC,EAAO,KAAK7F,KAAKqF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKjG,EACFoI,GAAKpI,GA+BV+I,GAAiBtB,GAAY,UACjC,GAAI9H,EAAOoJ,KAAmB7I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOqJ,gBAAkB9I,EACzBP,EAAOoJ,IAAkB7I,EAOzB,IAAI+I,GAAW,SAAUrB,EAAMsB,EAAUC,GACvCvB,EAAOuB,EAAevB,EAAOrC,EAAO6D,GAASC,GAAMzB,GAE/ChH,EAAI0I,QAAUH,IAAcvB,EAAK0B,MAAQpJ,GACzCU,EAAI2I,qBAAuBJ,IAAcvB,EAAK4B,KAAOtJ,GAGzD,IAAIuJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJ7H,EACA,eACAoC,OAAO4B,KAAK4B,GACTvB,OAAO,SAAUyD,GAChB,OAAOlC,EAAKkC,IAAQ9J,IAErB4I,IAAI,SAAUkB,GACb,OACEtI,EAAuBsI,GACvB,IACAtI,EAAuBoG,EAAKkC,MAG/BjB,KAAK,KACR,SACArC,KAAKD,OAILwD,GACFnK,EAAiBoK,UAAYrF,EAAKxB,EAAe,YAC/C8G,GAAkBF,IAAuB/I,EAEzCkJ,GAAc,CAChBC,QA+oBJ,gBA9oBIH,SAAUC,IASZnK,EAAY,SAAUsK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJrK,EAAKqK,GACLnB,GACE1D,EAAO2E,GAAa,CAClBI,KAAM9J,EACNwD,MAAOoG,EACPG,KAAMzJ,EAAI0J,WAEZxK,EACAE,IAMJ4B,EACEtB,EACA,SAAUiK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASlC,QAAQ3I,IAC3CC,EAAU2K,EAAME,UAGpBxK,GAOF,IAwDIyK,GAxDAC,GAAQtE,KAERuE,GAAW,EAOXC,GAAOnL,EAAiBmL,MAAQpG,EAAKxB,EAAe,QAGpD6H,MA/KsBC,GA+KCrL,EAAiBoL,cA9KvBC,GA+KjBrL,EAAiBoL,WACjBrG,EAAKxB,EAAe,eAAiB/C,GACrCuE,EAAKxB,EAAe,aAAe/C,GACnCuE,EAAKxB,EAAe,gBAAkB/C,EAGtC8K,KACqC,SAAvCvG,EAAKxB,EAAe,iBACpBvD,EAAiBsL,cAAgB/K,GAI/BgL,GACFvL,EAAiBwL,UACjBzG,EAAKxB,EAAe,cACpBsE,GAAY,IAAMlH,EAGhB8K,GAAcvG,EAChBlF,EAAiByL,aAAe1G,EAAKxB,EAAe,iBAIlDwF,GAAc7D,EAChBlF,EAAiB+I,aAAehE,EAAKxB,EAAe,iBAIlDmI,GAAqBxG,EACvBlF,EAAiB0L,oBACf3G,EAAKxB,EAAe,yBAIpBoI,GACF3L,EAAiB2L,gBAAkB5G,EAAKxB,EAAe,mBAGrD4E,GACFnI,EAAiBmI,mBACjBpD,EAAKxB,EAAe,sBAItB,IAEEyH,GAAWzE,GAAsB,KAC7BqF,KAAKC,iBAAiBC,kBAAkBC,SACxC3L,EACJ,MAAOgE,IACPjE,EAAKiE,IAOP,IAAI4H,GAAUjM,EAAOiM,QACjBC,GACFjL,EAAIkL,WACJnM,EAAOoM,aACPpM,EAAOqM,aACPrM,EAAOsM,UACNL,KAAYA,GAAQM,QACrBvM,EAAOwM,YACPxM,EAAOyM,MACPpJ,GACAoE,KAAKC,UAAYD,KAAKC,SAGpBgF,GACFlG,GAAsB,MAAQA,GAAsB,QAElD0F,KAAK3B,GAAY2B,IAAM3L,GAE3B,IAAIkJ,GAAU7D,EAAO2E,GAAa,CAEhCoC,GAAInG,GAAsB,MAAQ/E,EAAYpB,EAE9CK,MAAOS,EAAImB,UAAY5B,EACvBuK,SAAUA,GACV2B,QAASF,GAAqB5F,KAASzG,EAGvCwM,WAAYrG,GAAsB,MAAQM,KAASzG,IA0BrD,GAvBAoJ,GAAQqD,IAAMtM,EAIVmC,IACF8G,GAAQsD,OAASpK,EAAOoK,OACxBtD,GAAQuD,OAAS/K,EAAUU,EAAOqK,SAS/BzL,EAAI0L,SAAS7M,EAAK,4CAInBkK,KAAoBjJ,IACtBoI,GAAQyD,kBAAoB7L,IAGzBgK,IAAcrK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBmC,EAAU,SAK7B,GAAlC9B,EAAiBwH,QAAQ,OACxB,aAAavF,KAAKjC,IACnB+I,IAEDhK,EACE,mBACEiB,EACA,SACA8B,EACA,0BAON,IACIgK,GA0DAC,GA3DA1D,GAAO,GAGP2D,GAAc,WAKhB,OAFEpN,EAAiBqN,UAAYtI,EAAKxB,EAAe,aAGzBjC,EAAI+L,UAAY,IACrCvI,QAAQ1D,EAAkBiJ,IAC1BvF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS1E,GAKjCiN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKhB,GAAL,CAEA,IAAIiB,EAAS/H,EAAO2E,GAAa,CAC/BI,KAAM,SACNiD,YAAaF,EAAOD,EAAKhE,GAAQmD,UAenC,GAXIpG,GAAsB,OACxBmH,EAAOE,SAAWpG,KAAKqG,OAAOlH,KAAQsE,GAAQqC,IAngBnC,MAqgBbA,GAAW,EACXrC,GAAQtE,KAGJJ,GAAsB,UACxBmH,EAAOxC,SAAW1D,KAAKsG,IAAI,EAAG5C,GAAU6C,OAGtCN,IAASzM,EAAIgN,WAEf3E,GAASqE,EAAQtN,EAAcE,QAE/B,IACEU,EAAIgN,WAAWC,KAAKjN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU0L,IAC3D,MAAOQ,GAEP7E,GAASqE,EAAQtN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAI6M,QACA,KAAOpL,KAAYhD,GAASwN,KAClCJ,GAAcxG,MACT2G,IAAY3G,KAAQwG,IAE7B5M,GAGF2B,EAAqBa,EAAUwK,GAAahN,GAE5C,IAAI6N,GAAO9M,EAAI8M,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuB/L,EAAgBQ,IAAiB,EACxDwL,EAAS9G,KAAKsG,IAChBM,GAAKxL,IAAiB,EACtBwL,GAAKvL,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO2E,KAAK+G,IACV,IAKI,EAJJ/G,KAAKqG,MACF,MAAQvL,EAAgBkM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOlK,IAEP,OADAjE,EAAKiE,IACE,IAIXlC,EAAqB,OAAQ,WAC3BgJ,GAAW6C,KACX7L,EACEO,EACA,WACMyI,GAAW6C,OAAY7C,GAAW6C,OAExCxN,KAQJ,IAgCIkO,GAoCAC,GAAUC,GApEVC,GAAU,SAAUC,GACtB,IAAIlE,EAAO,GAIX,IACEA,EAAOkE,GAAa/M,EAAuBZ,EAAI0J,UAC/C,MAAOxG,IACPjE,EAAKiE,IAGP,IAAI0K,EAAyB/O,EAAO4L,IACpC,GAAIjE,GAAWoH,GACb,IACEnE,EAAOmE,EAAuBlL,KAAK7D,EAAQ,CAAE4K,KAAMA,KAAWA,EAC9D,MAAOvG,IACPF,EAAe,OAAQE,IAK3B,IA5YiB,SAAUuG,GAC3B,IAAK,IAAIhC,KAAK8C,GAAa,CACzB,IAAIsD,EAAgBtD,GAAY9C,GAChC,GAAKoG,EAAL,CAGA,IAAIC,EA9OI,KA+OND,EAAc,GAAcA,EA/OtB,IA+O8CA,EAEtD,GACEC,IAAerE,GACf,IAAIjE,OACF,IAAM9B,EAAYoK,GAAYlK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKsH,GAEP,OAAOrK,GAEX,OAAOC,EA0XH0O,CAAatE,GAQjB,MAFY,QAARQ,IAAkBjK,EAAIgO,OAAMvE,GAAQzJ,EAAIgO,KAAK3J,MAAM,KAAK,IAErDoF,EAPLxK,EAAKuB,EAAiB,YAAciJ,IAgDpCwE,GAAW,SACbC,EACAC,EACAtH,EACAuH,IAEKA,GAAe5H,GAAWK,KAAWuH,EAAcvH,GACxD,IACIwH,EAGEC,EAJFlG,EAAW5B,GAAW4H,GAAeA,EAAc,aAEnD5K,EAAS2K,KAAgD,EAA9BA,EAAczG,QAAQ,OAGnDyG,GADIG,EAAQH,EAAc9J,MAAM,MACVkK,QACtBF,EAAc,IAAMC,EAAMvG,KAAK,MAGjC,IAAI0B,EAAOiE,GAAQS,GAGnB,GAAK1E,GAAQuC,IAAgBvC,EAA7B,CAEAuC,GAAevC,EACflB,GAAKkB,KAAOA,EAGRpE,GAAsB,OACxBkD,GAAKiG,eACHlI,KAAKsG,IAAIxL,EAA2B,aAAK,EAAGvC,EAAO4P,YAAc,IACjE,KACFlG,GAAKmG,gBACHpI,KAAKsG,IACHxL,EAAgBQ,IAAiB,EACjC/C,EAAO8P,aAAe,IACnB,MAILtJ,GAAsB,MACpBvF,EAAIuB,KAAWkH,GAAKlH,GAAYvB,EAAIuB,IAItCe,GAAUiD,GAAsB,QAClCkD,GAAKqG,aAAexM,EAAOyM,MAC3BtG,GAAKuG,cAAgB1M,EAAOgL,QAI9B,IAII2B,EAJAC,EAAOnQ,EAAOoQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG1F,KAC/D,MAAOtG,IACPjE,EAAKiE,IAGPuK,GAAgBsB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBrH,QAAQqH,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGxH,QAAQsH,EAAKE,GAAgB1F,MAGxC,IAAI4F,EAA0BjD,GAC1BA,GAAS9H,MA1uBH,KA0uBgB,GACtBnF,EACJsO,GAAWrB,IACgD,EAAvD3B,GAAmB9C,QAAQ0H,IAC3BA,GAA2BlP,EAC3Bb,EAGJkJ,GAAK8G,OACH,QAAQlN,KAAK+J,OAAkBgC,GAAeT,GAC1CpO,GACCmO,GAEP3G,EAAWD,GAAeC,EAAU,CAClC2C,KAAMhK,EACNiK,KAAMlB,GAAKkB,OAGb,IAAI6F,EAAsB,WACxB7O,EAA2BrB,EAC3B,IAAImQ,EACFrB,GAAeT,KAAkBpI,GAAsB,MA7H1C,SACjB6I,EACAsB,EACAhC,EACAjG,EACAV,EACAuB,GAEI8F,GAAa7B,GAAY,GAAK/D,GAAQmD,QAASrM,GAC/CmM,KAAoBjD,GAAQmD,QAAU9F,MAE1C,IAAI8J,EAActG,GAAkBuE,KAChCgC,EAAQvI,GAAeqI,EAAkBjI,GAE7CY,GACE,CACEmE,GAAIhE,GAAQmD,QACZjC,KAAMhK,EACN2M,UAAWqD,GAAoBhC,EAAWrB,GAAW,KACrDuD,MAAOA,EACPvK,EAAGA,GAEH0B,SAAU/F,EAAU+F,IAEtBuB,GAGFmF,GAAmBpB,GACnBA,GAAWsD,EAEXxN,IAgGE0N,CACEzB,EACAqB,EACA/B,GACAa,EACAxH,EACAuB,IAIJ,GAAK3H,EAmBH6O,SAjBA,IACM9N,GAAUgF,GAAWhF,EAAOoO,sBAC9BpO,EACGoO,qBAAqB,CAAC9N,EAAcC,IACpC8N,KAAK,SAAUC,GACdxH,GAAQyH,QAAUD,EAAkBhO,GACpCwG,GAAQ0H,WAAaF,EAAkB/N,GACvCuN,MAEDW,SAAMX,GAETA,IAEF,MAAOtC,GACPsC,OAWFY,GAAMrR,EAAOsR,QACbC,GAAeF,GAAMA,GAAIG,UAAYnR,EACrCoR,GAAMzR,EAAO0R,cACbC,GAAgB,YAIhBpG,IAAegG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB1G,GAoBAgH,IAlBrB,WACL,IAEI7G,EAFAhF,EAAMhC,UACNgO,EAAKD,GAAK3N,MAAM6N,KAAMjM,GAY1B,OAVI6B,GAAWiK,OACb9G,EAAQ,IAAI8G,MAAMjH,KAIlBG,EAAQvJ,EAAIyQ,YAAY,UAClBC,UAAUtH,GAAMpK,EAASA,GAEjCuK,EAAMhH,UAAYgC,EAClB2L,GAAI3G,GACGgH,IAMX3P,EACEwP,GACA,WACEvC,GAAS,IAEX5O,GAGF2B,EACE,WACA,WACEiN,GAAS,IAEX5O,IAKA+K,IAAuB,QAARH,IAAkB,iBAAkBpL,GACrDmC,EACE,aACA,WACEiN,GAAS,IAEX5O,GAIA+K,IAAa6D,KAEjBpP,EAAOkS,YAAc,SAAUtH,EAAM5C,EAAUuB,GAC7C6F,GAAS,EAAGxE,EAAM5C,EAAUuB,IAQ9B,IAAI4I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUtH,EAAO9C,EAAUuH,IACpCA,GAAe5H,GAAWK,KAAWuH,EAAcvH,GAExD,IAAIqK,EAAkB1K,GAAWmD,GAC7BvB,EAAW5B,GAAW4H,GAAeA,EAAc,aACnD+C,SAAmBxH,EAEvB,GAAIqH,GAAWtJ,QAAQyJ,GAAa,IAAMD,EAExC,OADAlO,EAAeqH,GAAmB5K,EAAY,aAAe0R,GACtD/I,IAGT,IACE,GAAI8I,EAAiB,CACnB,IAAIE,EAAczH,IAClB,GAAIqH,GAAWtJ,eAAe0J,GAAe,EAK3C,OAJApO,EACEqH,GACAV,EAAQ,uBAAyByH,GAE5BhJ,IAETuB,EAAQyH,GAEV,MAAOlO,IAEP,OADAF,EAAeqH,GAAmBnH,IAC3BkF,IAGTuB,GAAS,GAAKA,GAAO/F,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAIyN,EAAc,CAAE7H,KAAM/J,EAAWkK,MAAOA,GACxC2H,GAAa7D,IAAiBxL,EAAQ,EAE1C4E,EAAWD,GAAeC,EAAUwK,GAEhC1H,GACFxB,GACE1D,EAAO4M,EAAa,CAClB/E,GAAI3G,KACJ+J,MAAOvI,IAAgBmK,GACvBnF,UACGmF,GAAa9D,KAAanI,GAAsB,KAC7CkI,GACA,KAEN1G,SAAU/F,EAAU+F,KAEtBuB,IAKFmJ,GAAmB,SAAU5H,EAAO9C,EAAUuB,GAChD6I,GAAUtH,EAAO9C,EAAUuB,IAIxBvJ,EAAOwL,MACVxL,EAAOwL,IAAqBkH,IAE9B,IAAIC,GAAY3S,EAAOwL,IAGnBoH,GAAQD,IAAaA,GAAUlK,EAAIkK,GAAUlK,EAAI,GAMrD,IAAK,IAAIqC,MAHT9K,EAAOwL,IAAqBkH,GAGVE,GACZtO,EAAQsO,GAAO9H,MACjBzF,MAAMC,QAAQsN,GAAM9H,KAChBsH,GAAUlO,MAAM,KAAM0O,GAAM9H,KAC5BsH,GAAUQ,GAAM9H,MAGxB,MAAOqD,IACPhO,EAAUgO,IA7IY,IAAUxD,GACxBkH,GArnBkBvG,GAnN9B,CAu9BEtL,OACA,uBACA"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/light.js b/dist/latest/light.js index 8f61160..9915212 100644 --- a/dist/latest/light.js +++ b/dist/latest/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 5f98; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; f793; v12) */ -!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,p=l.location,g=p.host,i=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,d=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://queue."+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,T=function(t,e,n){t=n?t:A(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},F=e.hostname||x(E,"hostname"),H=F||g,z={version:"cdn_light_12",hostname:H};e.mode||x(E,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=A(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!1,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),H!==g&&(J.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||F||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||x(E,"referrer")||i.referrer||"").replace(g,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=A(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)T(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){T(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=H+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);T({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var a,i;N(r);q(t)&&-1>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||x($,V)||"sa",C=e.strictUtm||"true"==x($,"strict-utm"),T=B+"_loaded";if(1==l[T])return f(c+"twice");l.sa_event_loaded=!0,l[T]=!0;var F,H=function(t,e,n){t=n?t:A(M,Z,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||x($,"hostname"),z=L||g,J={version:"cdn_light_12",hostname:z};e.mode||x($,"mode");try{F=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}E&&(J.bot=!0);var M=A(J,{ua:o,https:d.protocol==n,timezone:F,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!1,w&&(M.mobile=w.mobile,M.brands=v(w.brands)),z!==g&&(M.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||L||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||x($,"referrer")||i.referrer||"").replace(g,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,K=function(e,t){var n=A(J,{type:"append",original_id:t?e:M.page_id});if(t||!m.sendBeacon)H(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){H(n,0,!0)}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:u;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);q(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/app.js b/dist/v12/app.js index a428f09..9eaa082 100644 --- a/dist/v12/app.js +++ b/dist/v12/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; ac4d; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; f9a6; SRI-version; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,q="https://queue."+e,M=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[qt];if(!it(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[Mt];if(!ot(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.js","sources":["app.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/auto-events.js b/dist/v12/auto-events.js index 8fc14a1..88e5d43 100644 --- a/dist/v12/auto-events.js +++ b/dist/v12/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; e658; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; e658; SRI-version; v12) */ function r(t,e){var n,o;t.hasAttribute("data-simple-event")||(n=!1,b.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(b.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?n="download":b.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==h.location.hostname?n="outbound":b.emails&&/^mailto:/i.test(t.href)?n="email":b.phones&&/^tel:/i.test(t.href)&&(n="phone"),n&&(e?(o="saAutomatedLink(this, '"+n+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(o+=" return false;"),t.setAttribute("onclick",o)):t.addEventListener("click",function(){g(this,n)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!it(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(h,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v12/custom/app.js.map b/dist/v12/custom/app.js.map index 4cd0921..e18e5cc 100644 --- a/dist/v12/custom/app.js.map +++ b/dist/v12/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/auto-events.js b/dist/v12/custom/auto-events.js index 8fc14a1..88e5d43 100644 --- a/dist/v12/custom/auto-events.js +++ b/dist/v12/custom/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; e658; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; e658; SRI-version; v12) */ function r(t,e){var n,o;t.hasAttribute("data-simple-event")||(n=!1,b.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(b.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?n="download":b.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==h.location.hostname?n="outbound":b.emails&&/^mailto:/i.test(t.href)?n="email":b.phones&&/^tel:/i.test(t.href)&&(n="phone"),n&&(e?(o="saAutomatedLink(this, '"+n+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(o+=" return false;"),t.setAttribute("onclick",o)):t.addEventListener("click",function(){g(this,n)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,H=function(t,e,n){t=n?t:$(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},T=e.hostname||A(x,"hostname"),F=T||g,z={version:"custom_light_12",hostname:F};e.mode||A(x,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=$(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!0,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),F!==g&&(J.hostname_original=g),i in m&&"1"==m[i])return f("Not sending request when "+i+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||T||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||A(x,"referrer")||a.referrer||"").replace(g,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=$(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)H(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){H(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,i,a){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=F+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var i,a;N(r);E(t)&&-1"); +!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,d=l.location,g=d.host,i=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,p=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,x=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var $=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},I=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||A(E,V)||"sa",C=e.strictUtm||"true"==A(E,"strict-utm"),H=B+"_loaded";if(1==l[H])return f(c+"twice");l.sa_event_loaded=!0,l[H]=!0;var T,F=function(t,e,n){t=n?t:I(M,Z,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||A(E,"hostname"),z=L||g,J={version:"custom_light_12",hostname:z};e.mode||A(E,"mode");try{T=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}x&&(J.bot=!0);var M=I(J,{ua:o,https:d.protocol==n,timezone:T,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!0,w&&(M.mobile=w.mobile,M.brands=v(w.brands)),z!==g&&(M.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||L||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||A(E,"referrer")||i.referrer||"").replace(g,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,K=function(e,t){var n=I(J,{type:"append",original_id:t?e:M.page_id});if(t||!m.sendBeacon)F(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){F(n,0,!0)}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:u;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||u);F({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);$(t)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v12/custom/light.js.map b/dist/v12/custom/light.js.map index 4563a96..e0ad431 100644 --- a/dist/v12/custom/light.js.map +++ b/dist/v12/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/proxy.js b/dist/v12/custom/proxy.js index e8c6791..e9d5081 100644 --- a/dist/v12/custom/proxy.js +++ b/dist/v12/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 6f40; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 6842; SRI-version; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!it(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(h,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",I="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v12/custom/proxy.js.map b/dist/v12/custom/proxy.js.map index fe419aa..09e2285 100644 --- a/dist/v12/custom/proxy.js.map +++ b/dist/v12/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/light.js b/dist/v12/light.js index 5ad37a9..757beff 100644 --- a/dist/v12/light.js +++ b/dist/v12/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 12b3; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; bf3a; SRI-version; v12) */ -!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,p=l.location,g=p.host,i=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,d=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://queue."+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,T=function(t,e,n){t=n?t:A(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},F=e.hostname||x(E,"hostname"),H=F||g,z={version:"cdn_light_12",hostname:H};e.mode||x(E,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=A(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!0,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),H!==g&&(J.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||F||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||x(E,"referrer")||i.referrer||"").replace(g,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=A(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)T(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){T(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=H+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);T({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var a,i;N(r);q(t)&&-1>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||x($,V)||"sa",C=e.strictUtm||"true"==x($,"strict-utm"),T=B+"_loaded";if(1==l[T])return f(c+"twice");l.sa_event_loaded=!0,l[T]=!0;var F,H=function(t,e,n){t=n?t:A(M,Z,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||x($,"hostname"),z=L||g,J={version:"cdn_light_12",hostname:z};e.mode||x($,"mode");try{F=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}E&&(J.bot=!0);var M=A(J,{ua:o,https:d.protocol==n,timezone:F,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!0,w&&(M.mobile=w.mobile,M.brands=v(w.brands)),z!==g&&(M.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||L||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||x($,"referrer")||i.referrer||"").replace(g,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,K=function(e,t){var n=A(J,{type:"append",original_id:t?e:M.page_id});if(t||!m.sendBeacon)H(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){H(n,0,!0)}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:u;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);q(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 639b29a..7941b9d 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "pretest": "pnpm run build:testing", "test": "node -r dotenv/config ./test/index.js", "test:matrix": "mocha test/helpers/get-browsers.test.js", + "test:unit": "mocha 'test/unit/*.test.js'", "test:deploy": "node --test test/deploy.test.mts", "posttest": "pnpm run build", "typecheck": "tsc --noEmit" @@ -39,16 +40,16 @@ "devDependencies": { "@types/node": "24.13.3", "acorn": "^8.18.0", - "browserstack-local": "^1.5.1", - "chai": "^4.2.0", + "browserstack-local": "^1.5.14", + "chai": "^4.5.0", "dotenv": "^8.2.0", - "eslint": "^6.7.2", + "eslint": "^8.57.1", "esprima": "^4.0.1", - "handlebars": "^4.7.6", - "mocha": "^6.2.3", - "nodemon": "^1.19.4", - "request": "^2.88.0", - "selenium-webdriver": "^4.3.1", + "handlebars": "^4.7.9", + "jsdom": "^26.1.0", + "mocha": "^12.0.2", + "nodemon": "^3.1.14", + "selenium-webdriver": "^4.49.0", "typescript": "7.0.2", "uglify-js": "^3.9.4", "uuid-validate": "0.0.3" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e88fece..3122f48 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,11 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + minimist@<1.2.6: ^1.2.8 + minimatch@<3.1.4: ^3.1.4 + brace-expansion@<1.1.18: ^1.1.18 + importers: .: @@ -19,35 +24,35 @@ importers: specifier: ^8.18.0 version: 8.18.0 browserstack-local: - specifier: ^1.5.1 - version: 1.5.1(supports-color@5.5.0) + specifier: ^1.5.14 + version: 1.5.14(supports-color@5.5.0) chai: - specifier: ^4.2.0 - version: 4.2.0 + specifier: ^4.5.0 + version: 4.5.0 dotenv: specifier: ^8.2.0 version: 8.2.0 eslint: - specifier: ^6.7.2 - version: 6.7.2(supports-color@5.5.0) + specifier: ^8.57.1 + version: 8.57.1(supports-color@5.5.0) esprima: specifier: ^4.0.1 version: 4.0.1 handlebars: - specifier: ^4.7.6 - version: 4.7.6 + specifier: ^4.7.9 + version: 4.7.9 + jsdom: + specifier: ^26.1.0 + version: 26.1.0(supports-color@5.5.0) mocha: - specifier: ^6.2.3 - version: 6.2.3 + specifier: ^12.0.2 + version: 12.0.2 nodemon: - specifier: ^1.19.4 - version: 1.19.4 - request: - specifier: ^2.88.0 - version: 2.88.0 + specifier: ^3.1.14 + version: 3.1.14 selenium-webdriver: - specifier: ^4.3.1 - version: 4.3.1 + specifier: ^4.49.0 + version: 4.49.0 typescript: specifier: 7.0.2 version: 7.0.2 @@ -60,11 +65,11 @@ importers: packages: - '@babel/code-frame@7.5.5': - resolution: {integrity: sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==} + '@asamuzakjp/css-color@3.2.0': + resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} - '@babel/highlight@7.5.0': - resolution: {integrity: sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==} + '@bazel/runfiles@6.5.0': + resolution: {integrity: sha512-RzahvqTkfpY2jsDxo8YItPX+/iZ6hbiikw1YhE0bA9EKBR5Og8Pa6FHn9PO9M0zaXRVsr0GFQLKbB/0rzy9SzA==} '@clack/core@1.4.3': resolution: {integrity: sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ==} @@ -74,15 +79,80 @@ packages: resolution: {integrity: sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==} engines: {node: '>= 20.12.0'} - '@types/keyv@3.1.4': - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + '@csstools/color-helpers@5.1.0': + resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} + engines: {node: '>=18'} + + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-color-parser@3.1.0': + resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} + + '@eslint-community/eslint-utils@4.10.1': + resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} '@types/node@24.13.3': resolution: {integrity: sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==} - '@types/responselike@1.0.3': - resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} - '@typescript/typescript-aix-ppc64@7.0.2': resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} engines: {node: '>=16.20.0'} @@ -203,18 +273,16 @@ packages: cpu: [x64] os: [win32] + '@ungap/structured-clone@1.4.0': + resolution: {integrity: sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==} + abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - acorn-jsx@5.1.0: - resolution: {integrity: sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==} + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: - acorn: ^6.0.0 || ^7.0.0 - - acorn@7.1.1: - resolution: {integrity: sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==} - engines: {node: '>=0.4.0'} - hasBin: true + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 acorn@8.18.0: resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} @@ -225,260 +293,121 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} - ajv@6.10.2: - resolution: {integrity: sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==} + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} - ansi-align@2.0.0: - resolution: {integrity: sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==} + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} - ansi-colors@3.2.3: - resolution: {integrity: sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==} - engines: {node: '>=6'} - - ansi-escapes@4.3.0: - resolution: {integrity: sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==} + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@3.0.0: - resolution: {integrity: sha512-wFUFA5bg5dviipbQQ32yOQhl6gcJaJXiHE7dvR8VYPG97+J/GNC5FKGepKdEDUFeXRzDxPF1X/Btc8L+v7oqIQ==} - engines: {node: '>=4'} - - ansi-regex@4.1.0: - resolution: {integrity: sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==} - engines: {node: '>=6'} - - ansi-regex@5.0.0: - resolution: {integrity: sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==} + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - - anymatch@2.0.0: - resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - - arr-diff@4.0.0: - resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} - engines: {node: '>=0.10.0'} - - arr-flatten@1.1.0: - resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} - engines: {node: '>=0.10.0'} - - arr-union@3.1.0: - resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} - engines: {node: '>=0.10.0'} - - array-unique@0.3.2: - resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} - engines: {node: '>=0.10.0'} - - asn1@0.2.4: - resolution: {integrity: sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==} - - assert-plus@1.0.0: - resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} - engines: {node: '>=0.8'} + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - assign-symbols@1.0.0: - resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} - engines: {node: '>=0.10.0'} - - astral-regex@1.0.0: - resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} - engines: {node: '>=4'} - - async-each@1.0.3: - resolution: {integrity: sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - atob@2.1.2: - resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} - engines: {node: '>= 4.5.0'} - hasBin: true - - aws-sign2@0.7.0: - resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} - - aws4@1.9.1: - resolution: {integrity: sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==} - balanced-match@1.0.0: resolution: {integrity: sha512-9Y0g0Q8rmSt+H33DfKv7FOc3v+iRI+o1lbzt8jGcIosYW37IIW/2XVYq5NPdmaD5NQ59Nk26Kl/vZbwW9Fr8vg==} - base@0.11.2: - resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} - engines: {node: '>=0.10.0'} - - bcrypt-pbkdf@1.0.2: - resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} - - binary-extensions@1.13.1: - resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} - engines: {node: '>=0.10.0'} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} - bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} - boxen@1.3.0: - resolution: {integrity: sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==} - engines: {node: '>=4'} + brace-expansion@1.1.21: + resolution: {integrity: sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@5.0.12: + resolution: {integrity: sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==} + engines: {node: 20 || >=22} - braces@2.3.2: - resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} - engines: {node: '>=0.10.0'} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} browser-stdout@1.3.1: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - browserstack-local@1.5.1: - resolution: {integrity: sha512-T/wxyWDzvBHbDvl7fZKpFU7mYze6nrUkBhNy+d+8bXBqgQX10HTYvajIGO0wb49oGSLCPM0CMZTV/s7e6LF0sA==} - - cache-base@1.0.1: - resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} - engines: {node: '>=0.10.0'} + browserstack-local@1.5.14: + resolution: {integrity: sha512-JOoqBIcs3PbtnsBAyEx1kKDAXAnveBgY4A5m9NWUzj0UyXugmi4Ac9xsUjDT8lAfuzPiSzNbtwvH8RSG8xlBmg==} callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - camelcase@4.1.0: - resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} - engines: {node: '>=4'} - - camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - - capture-stack-trace@1.0.1: - resolution: {integrity: sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==} - engines: {node: '>=0.10.0'} - - caseless@0.12.0: - resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - - chai@4.2.0: - resolution: {integrity: sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==} - engines: {node: '>=4'} - - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} engines: {node: '>=4'} - chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - - check-error@1.0.2: - resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} - - chokidar@2.1.8: - resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==} - - ci-info@1.6.0: - resolution: {integrity: sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==} - - class-utils@0.3.6: - resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} - engines: {node: '>=0.10.0'} - - cli-boxes@1.0.0: - resolution: {integrity: sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==} - engines: {node: '>=0.10.0'} - - cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - - cli-width@2.2.0: - resolution: {integrity: sha512-EJLbKSuvHTrVRynOXCYFTbQKZOFXWNe3/6DN1yrEH3TuuZT1x4dMQnCHnfCrBUUiGjO63enEIfaB17VaRl2d4A==} + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} - cliui@5.0.0: - resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - collection-visit@1.0.0: - resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} - engines: {node: '>=0.10.0'} + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - component-emitter@1.3.0: - resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} - concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - configstore@3.1.2: - resolution: {integrity: sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==} - engines: {node: '>=4'} - - copy-descriptor@0.1.1: - resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} - engines: {node: '>=0.10.0'} - core-util-is@1.0.2: resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} - create-error-class@3.0.2: - resolution: {integrity: sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==} - engines: {node: '>=0.10.0'} - - cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - - cross-spawn@6.0.5: - resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} - engines: {node: '>=4.8'} - - crypto-random-string@1.0.0: - resolution: {integrity: sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==} - engines: {node: '>=4'} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} - dashdash@1.14.1: - resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} - engines: {node: '>=0.10'} + cssstyle@4.6.0: + resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} + engines: {node: '>=18'} - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} - debug@3.2.6: - resolution: {integrity: sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==} - deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: supports-color: optional: true - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -486,167 +415,77 @@ packages: supports-color: optional: true - decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - - decode-uri-component@0.2.0: - resolution: {integrity: sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==} - engines: {node: '>=0.10'} - - deep-eql@3.0.1: - resolution: {integrity: sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==} - engines: {node: '>=0.12'} + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} - deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} deep-is@0.1.3: resolution: {integrity: sha512-GtxAN4HvBachZzm4OnWqc45ESpUCMwkYcsjnsPs23FwJbsO+k4t0k9bQCgOmzIlpHO28+WPK/KRbRk0DDHuuDw==} - define-properties@1.1.3: - resolution: {integrity: sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==} - engines: {node: '>= 0.4'} - - define-property@0.2.5: - resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} - engines: {node: '>=0.10.0'} - - define-property@1.0.0: - resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} - engines: {node: '>=0.10.0'} - - define-property@2.0.2: - resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} - engines: {node: '>=0.10.0'} - - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} + diff@9.0.0: + resolution: {integrity: sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==} engines: {node: '>=0.3.1'} doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} - dot-prop@4.2.0: - resolution: {integrity: sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==} - engines: {node: '>=4'} - dotenv@8.2.0: resolution: {integrity: sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==} engines: {node: '>=8'} - duplexer3@0.1.4: - resolution: {integrity: sha512-CEj8FwwNA4cVH2uFCoHUrmojhYh1vmCdOaneKJXwkeY1i9jnlslVo9dx+hQ5Hl9GnH/Bwy/IjxAyOePyPKYnzA==} - - duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - - ecc-jsbn@0.1.2: - resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} - - emoji-regex@7.0.3: - resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es-abstract@1.17.6: - resolution: {integrity: sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==} - engines: {node: '>= 0.4'} - - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} - eslint-scope@5.0.0: - resolution: {integrity: sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==} - engines: {node: '>=8.0.0'} + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} - eslint-utils@1.4.3: - resolution: {integrity: sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==} - engines: {node: '>=6'} + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@1.1.0: - resolution: {integrity: sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==} - engines: {node: '>=4'} + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint@6.7.2: - resolution: {integrity: sha512-qMlSWJaCSxDFr8fBPvJM9kJwbazrhNcBU3+DszDW1OlEwKBBRWsJc7NJFelvwQpanHCR14cOLD41x8Eqvo3Nng==} - engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true - espree@6.1.2: - resolution: {integrity: sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==} - engines: {node: '>=6.0.0'} + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - esquery@1.0.1: - resolution: {integrity: sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==} - engines: {node: '>=0.6'} + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} - esrecurse@4.2.1: - resolution: {integrity: sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==} + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - event-stream@3.3.4: - resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==} - - execa@0.7.0: - resolution: {integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==} - engines: {node: '>=4'} - - expand-brackets@2.1.4: - resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} - engines: {node: '>=0.10.0'} - - extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} - - extend-shallow@3.0.2: - resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} - engines: {node: '>=0.10.0'} - - extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - - external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - - extglob@2.0.4: - resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} - engines: {node: '>=0.10.0'} - - extsprintf@1.3.0: - resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} - engines: {'0': node >=0.6.0} - - fast-deep-equal@2.0.1: - resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} fast-json-stable-stringify@2.0.0: resolution: {integrity: sha512-eIgZvM9C3P05kg0qxfqaVU6Tma4QedCPIByQOcemV0vju8ot3cS2DpHi4m2G2JvbSMI152rjfLX0p1pkSdyPlQ==} @@ -663,185 +502,104 @@ packages: fast-wrap-ansi@0.2.2: resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} - figures@3.1.0: - resolution: {integrity: sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==} - engines: {node: '>=8'} - - file-entry-cache@5.0.1: - resolution: {integrity: sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==} - engines: {node: '>=4'} - - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - - fill-range@4.0.0: - resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} - engines: {node: '>=0.10.0'} - - find-up@3.0.0: - resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} - engines: {node: '>=6'} - - flat-cache@2.0.1: - resolution: {integrity: sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==} - engines: {node: '>=4'} - - flat@4.1.0: - resolution: {integrity: sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==} - deprecated: Fixed a prototype pollution security issue in 4.1.0, please upgrade to ^4.1.1 or ^5.0.1. - hasBin: true + fastq@1.20.3: + resolution: {integrity: sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==} - flatted@2.0.1: - resolution: {integrity: sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==} + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} - for-in@1.0.2: - resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} - engines: {node: '>=0.10.0'} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} - forever-agent@0.6.1: - resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + find-up-simple@1.0.1: + resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} + engines: {node: '>=18'} - form-data@2.3.3: - resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} - engines: {node: '>= 0.12'} + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} - fragment-cache@0.2.1: - resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} - engines: {node: '>=0.10.0'} + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} - from@0.1.7: - resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} + flatted@3.4.4: + resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@1.2.13: - resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} - engines: {node: '>= 4.0'} + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - deprecated: Upgrade to fsevents v2 to mitigate potential security issues - - function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - - functional-red-black-tree@1.0.1: - resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.0: - resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} - - get-stream@3.0.0: - resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} - engines: {node: '>=4'} - - get-value@2.0.6: - resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} - engines: {node: '>=0.10.0'} - - getpass@0.1.7: - resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} - glob-parent@3.1.0: - resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - glob-parent@5.1.0: - resolution: {integrity: sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==} + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - glob@7.1.3: - resolution: {integrity: sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} glob@7.1.6: resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - global-dirs@0.1.1: - resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} - engines: {node: '>=4'} - - globals@12.3.0: - resolution: {integrity: sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==} + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} - got@6.7.1: - resolution: {integrity: sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==} - engines: {node: '>=4'} - - graceful-fs@4.2.1: - resolution: {integrity: sha512-b9usnbDGnD928gJB3LrCmxoibr3VE4U2SMo5PBuBnokWyDADTqDPXg4YpwKF1trpH+UbGp7QLicO3+aWEy0+mw==} + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - handlebars@4.7.6: - resolution: {integrity: sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==} + handlebars@4.7.9: + resolution: {integrity: sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==} engines: {node: '>=0.4.7'} hasBin: true - har-schema@2.0.0: - resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} - engines: {node: '>=4'} - - har-validator@5.1.3: - resolution: {integrity: sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==} - engines: {node: '>=6'} - deprecated: this library is no longer supported - has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} - has-symbols@1.0.1: - resolution: {integrity: sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==} - engines: {node: '>= 0.4'} - - has-value@0.3.1: - resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} - engines: {node: '>=0.10.0'} - - has-value@1.0.0: - resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} - engines: {node: '>=0.10.0'} - - has-values@0.1.4: - resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} - engines: {node: '>=0.10.0'} - - has-values@1.0.0: - resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} - engines: {node: '>=0.10.0'} - - has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} - http-signature@1.2.0: - resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} - engines: {node: '>=0.8', npm: '>=1.3.7'} + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} ignore-by-default@1.0.1: resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} - ignore@4.0.6: - resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} immediate@3.0.6: @@ -851,10 +609,6 @@ packages: resolution: {integrity: sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==} engines: {node: '>=6'} - import-lazy@2.1.0: - resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} - engines: {node: '>=4'} - imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -866,412 +620,167 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - ini@1.3.5: - resolution: {integrity: sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==} - deprecated: Please update to ini >=1.3.6 to avoid a prototype pollution issue - - inquirer@7.0.0: - resolution: {integrity: sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==} - engines: {node: '>=6.0.0'} + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} - is-accessor-descriptor@0.1.6: - resolution: {integrity: sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==} + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - deprecated: Please upgrade to v0.1.7 - is-accessor-descriptor@1.0.0: - resolution: {integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==} + is-glob@4.0.1: + resolution: {integrity: sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==} engines: {node: '>=0.10.0'} - deprecated: Please upgrade to v1.0.1 - is-binary-path@1.0.1: - resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==} + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-buffer@1.1.6: - resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} - is-buffer@2.0.4: - resolution: {integrity: sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==} - engines: {node: '>=4'} + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} - is-callable@1.2.0: - resolution: {integrity: sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==} - engines: {node: '>= 0.4'} + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} - is-ci@1.2.1: - resolution: {integrity: sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==} - hasBin: true + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - is-data-descriptor@0.1.4: - resolution: {integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==} - engines: {node: '>=0.10.0'} - deprecated: Please upgrade to v0.1.5 + is-running@2.1.0: + resolution: {integrity: sha512-mjJd3PujZMl7j+D395WTIO5tU5RIDBfVSRtRR4VOJou3H66E38UjbjvDGh3slJzPuolsb+yQFqwHNNdyp5jg3w==} - is-data-descriptor@1.0.0: - resolution: {integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==} - engines: {node: '>=0.10.0'} - deprecated: Please upgrade to v1.0.1 + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} - is-date-object@1.0.2: - resolution: {integrity: sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==} - engines: {node: '>= 0.4'} + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - is-descriptor@0.1.6: - resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==} - engines: {node: '>=0.10.0'} + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - is-descriptor@1.0.2: - resolution: {integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==} - engines: {node: '>=0.10.0'} + js-yaml@4.3.2: + resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} + hasBin: true - is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} + js-yaml@5.4.2: + resolution: {integrity: sha512-m+aqu+LwO1O6sIopafj8HUVl5aawITwZQe/yHpMCKjaWBaA/d07B/QdMb3529REftiU+RMMHL3Vlsw3hON7vWg==} + hasBin: true - is-extendable@1.0.1: - resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} - engines: {node: '>=0.10.0'} + jsdom@26.1.0: + resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - is-fullwidth-code-point@2.0.0: - resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} - engines: {node: '>=4'} + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - is-glob@3.1.0: - resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} - engines: {node: '>=0.10.0'} + jszip@3.10.2: + resolution: {integrity: sha512-3l+rb15IOWtUhU0H5MFqES/T6Kh7abYwjosBey/vD6hDt8zoEffkSC5Ws5SGtgVw3gBx2NEbhTeSW1+kWkpyTQ==} - is-glob@4.0.1: - resolution: {integrity: sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==} - engines: {node: '>=0.10.0'} + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - is-installed-globally@0.1.0: - resolution: {integrity: sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==} - engines: {node: '>=4'} + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} - is-npm@1.0.0: - resolution: {integrity: sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==} - engines: {node: '>=0.10.0'} + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - is-number@3.0.0: - resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} - engines: {node: '>=0.10.0'} + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} - is-obj@1.0.1: - resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} - engines: {node: '>=0.10.0'} + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - is-path-inside@1.0.1: - resolution: {integrity: sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==} - engines: {node: '>=0.10.0'} + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - is-promise@2.1.0: - resolution: {integrity: sha512-NECAi6wp6CgMesHuVUEK8JwjCvm/tvnn5pCbB42JOHp3mgUizN0nagXu4HEqQZBkieGEQ+jVcMKWqoVd6CDbLQ==} + lru-cache@11.5.3: + resolution: {integrity: sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==} + engines: {node: 20 || >=22} - is-redirect@1.0.0: - resolution: {integrity: sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==} - engines: {node: '>=0.10.0'} + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} + engines: {node: 18 || 20 || >=22} - is-regex@1.1.0: - resolution: {integrity: sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==} - engines: {node: '>= 0.4'} + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - is-retry-allowed@1.1.0: - resolution: {integrity: sha512-leC1bcIRBHjXtaZSM2gAXNeZsIOdDMgq/kHKAVKQ05JTwvb7hnvrHBEm6mnnMRyE7yu+ljNlcG8YUmALCevSxg==} - engines: {node: '>=0.10.0'} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - is-running@2.1.0: - resolution: {integrity: sha512-mjJd3PujZMl7j+D395WTIO5tU5RIDBfVSRtRR4VOJou3H66E38UjbjvDGh3slJzPuolsb+yQFqwHNNdyp5jg3w==} + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} - is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} + mocha@12.0.2: + resolution: {integrity: sha512-SjAulGHxlMJLCD1bhvJBAiYwYxglydRzA9PDQ5MALq1oLRMMtIhxSQJ0olCFgA7c9YbTdxC0KOV0wl8JEDYVhA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true - is-symbol@1.0.3: - resolution: {integrity: sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==} - engines: {node: '>= 0.4'} + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - - is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isobject@2.1.0: - resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} - engines: {node: '>=0.10.0'} - - isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - - isstream@0.1.2: - resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-yaml@3.13.1: - resolution: {integrity: sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==} - hasBin: true - - jsbn@0.1.1: - resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-schema@0.2.3: - resolution: {integrity: sha512-a3xHnILGMtk+hDOqNwHzF6e2fNbiMrXZvxKQiEv2MlgQP+pjIOzqAmKYD2mDpXYE/44M7g+n9p2bKkYWDUcXCQ==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - jsprim@1.4.1: - resolution: {integrity: sha512-4Dj8Rf+fQ+/Pn7C5qeEX02op1WfOss3PKTE9Nsop3Dx+6UPxlm1dr/og7o2cRa5hNN07CACr4NFzRLtj/rjWog==} - engines: {'0': node >=0.6.0} - - jszip@3.10.0: - resolution: {integrity: sha512-LDfVtOLtOxb9RXkYOwPyNBTQDL4eUbqahtoY6x07GiDJHwSYvn8sHHIw8wINImV3MqbMNve2gSuM1DDqEKk09Q==} - - kind-of@3.2.2: - resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} - engines: {node: '>=0.10.0'} - - kind-of@4.0.0: - resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} - engines: {node: '>=0.10.0'} - - kind-of@5.1.0: - resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} - engines: {node: '>=0.10.0'} - - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - - latest-version@3.1.0: - resolution: {integrity: sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w==} - engines: {node: '>=4'} - - levn@0.3.0: - resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} - engines: {node: '>= 0.8.0'} - - lie@3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - - locate-path@3.0.0: - resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} - engines: {node: '>=6'} - - lodash@4.17.15: - resolution: {integrity: sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==} - - log-symbols@2.2.0: - resolution: {integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==} - engines: {node: '>=4'} - - lowercase-keys@1.0.1: - resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} - engines: {node: '>=0.10.0'} - - lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - - make-dir@1.3.0: - resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} - engines: {node: '>=4'} - - map-cache@0.2.2: - resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} - engines: {node: '>=0.10.0'} - - map-stream@0.1.0: - resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==} - - map-visit@1.0.0: - resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} - engines: {node: '>=0.10.0'} - - micromatch@3.1.10: - resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} - engines: {node: '>=0.10.0'} - - mime-db@1.43.0: - resolution: {integrity: sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==} - engines: {node: '>= 0.6'} - - mime-types@2.1.26: - resolution: {integrity: sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==} - engines: {node: '>= 0.6'} - - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - minimatch@3.0.4: - resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} - - minimist@1.2.5: - resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} - - mixin-deep@1.3.2: - resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} - engines: {node: '>=0.10.0'} - - mkdirp@0.5.4: - resolution: {integrity: sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==} - deprecated: Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.) - hasBin: true - - mkdirp@0.5.5: - resolution: {integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==} - hasBin: true - - mocha@6.2.3: - resolution: {integrity: sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg==} - engines: {node: '>= 6.0.0'} - hasBin: true - - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - - ms@2.1.1: - resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==} - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - - nan@2.14.1: - resolution: {integrity: sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==} - - nanomatch@1.2.13: - resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} - engines: {node: '>=0.10.0'} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - neo-async@2.6.1: - resolution: {integrity: sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==} - - nice-try@1.0.5: - resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - node-environment-flags@1.0.5: - resolution: {integrity: sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==} - - nodemon@1.19.4: - resolution: {integrity: sha512-VGPaqQBNk193lrJFotBU8nvWZPqEZY2eIzymy2jjY0fJ9qIsxA0sxQ8ATPl0gZC645gijYEc1jtZvpS8QWzJGQ==} - engines: {node: '>=4'} + nodemon@3.1.14: + resolution: {integrity: sha512-jakjZi93UtB3jHMWsXL68FXSAosbLfY0In5gtKq3niLSkrWznrVBzXFNOEMJUfc9+Ke7SHWoAZsiMkNP3vq6Jw==} + engines: {node: '>=10'} hasBin: true nopt@1.0.10: resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} hasBin: true - normalize-path@2.1.1: - resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} - engines: {node: '>=0.10.0'} - normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - npm-run-path@2.0.2: - resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} - engines: {node: '>=4'} - - oauth-sign@0.9.0: - resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} - - object-copy@0.1.0: - resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} - engines: {node: '>=0.10.0'} - - object-inspect@1.7.0: - resolution: {integrity: sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object-visit@1.0.1: - resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} - engines: {node: '>=0.10.0'} - - object.assign@4.1.0: - resolution: {integrity: sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==} - engines: {node: '>= 0.4'} - - object.getownpropertydescriptors@2.1.0: - resolution: {integrity: sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==} - engines: {node: '>= 0.8'} - - object.pick@1.3.0: - resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} - engines: {node: '>=0.10.0'} + nwsapi@2.2.28: + resolution: {integrity: sha512-IlVB7OS7qrOsVYlpnFIkETjMwT9jwvmocJmmM+GZU/PAB3uGi9Ezd7vcWhWBUnSc0ya4ppmQITOyP1ez9gg8cg==} once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - onetime@5.1.0: - resolution: {integrity: sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==} - engines: {node: '>=6'} - - optionator@0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} - p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - - p-limit@2.2.2: - resolution: {integrity: sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==} - engines: {node: '>=6'} - - p-locate@3.0.0: - resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} - engines: {node: '>=6'} - - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - - package-json@4.0.1: - resolution: {integrity: sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA==} - engines: {node: '>=4'} + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} @@ -1280,399 +789,206 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} - pascalcase@0.1.1: - resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} - engines: {node: '>=0.10.0'} - - path-dirname@1.0.2: - resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} - path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} - path-is-inside@1.0.2: - resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} - - path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - - pathval@1.1.0: - resolution: {integrity: sha512-qZ181q3ICkag/+lv1X6frDUF84pqCm30qild3LGbD84n0AC75CYwnWsQRDlpz7zDkU5NVcmhHh4LjXK0goLYZA==} + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} - pause-stream@0.0.11: - resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} - performance-now@2.1.0: - resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - posix-character-classes@0.1.1: - resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} - engines: {node: '>=0.10.0'} + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} - prelude-ls@1.1.2: - resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prepend-http@1.0.4: - resolution: {integrity: sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==} - engines: {node: '>=0.10.0'} - process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - - ps-tree@1.2.0: - resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==} - engines: {node: '>= 0.10'} - hasBin: true - - pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - - psl@1.7.0: - resolution: {integrity: sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==} - pstree.remy@1.1.8: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} - punycode@1.4.1: - resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} - - punycode@2.1.1: - resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qs@6.5.2: - resolution: {integrity: sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==} - engines: {node: '>=0.6'} - - rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} readable-stream@2.3.6: resolution: {integrity: sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==} - readdirp@2.2.1: - resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} - engines: {node: '>=0.10'} - - regex-not@1.0.2: - resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} - engines: {node: '>=0.10.0'} - - regexpp@2.0.1: - resolution: {integrity: sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==} - engines: {node: '>=6.5.0'} - - registry-auth-token@3.4.0: - resolution: {integrity: sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==} - - registry-url@3.1.0: - resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} - engines: {node: '>=0.10.0'} - - remove-trailing-separator@1.1.0: - resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} - - repeat-element@1.1.3: - resolution: {integrity: sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==} - engines: {node: '>=0.10.0'} - - repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - - request@2.88.0: - resolution: {integrity: sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==} - engines: {node: '>= 4'} - deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} - require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + readdirp@5.1.1: + resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} + engines: {node: '>= 20.19.0'} resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - resolve-url@0.2.1: - resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} - deprecated: https://github.com/lydell/resolve-url#deprecated - - restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - - ret@0.1.15: - resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} - engines: {node: '>=0.12'} - - rimraf@2.5.4: - resolution: {integrity: sha512-Lw7SHMjssciQb/rRz7JyPIy9+bbUshEucPoLRvWqy09vC5zQixl8Uet+Zl+SROBB/JMWHJRdCk1qdxNWHNMvlQ==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - rimraf@2.6.3: - resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - run-async@2.3.0: - resolution: {integrity: sha512-Fx+QT3fGtS0jk8OvKyKgAB2YHPsrmqBRcMeTC5AZ+lp4vzXKPPrFSY3iLdgvjA3HVBkIvJeM6J80LRjx8bQwhA==} - engines: {node: '>=0.12.0'} + rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} - rxjs@6.5.3: - resolution: {integrity: sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==} - engines: {npm: '>=2.0.0'} + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - safe-regex@1.1.0: - resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - selenium-webdriver@4.3.1: - resolution: {integrity: sha512-TjH/ls1WKRQoFEHcqtn6UtwcLnA3yvx08v9cSSFYvyhp8hJWRtbe9ae2I8uXPisEZ2EaGKKoxBZ4EHv0BJM15g==} - engines: {node: '>= 10.15.0'} + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} - semver-diff@2.1.0: - resolution: {integrity: sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==} - engines: {node: '>=0.10.0'} + selenium-webdriver@4.49.0: + resolution: {integrity: sha512-16XqeOEMj+4+p+pzLLyvNWmF5jCY05EKIl3e1anZBgv4+zq7PUTtiNjKtQhMpwosZ0wIMKDFAQ2xdyogOHD4DA==} + engines: {node: '>= 22.0.0'} - semver@5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} hasBin: true - semver@6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} - hasBin: true - - set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - - set-value@2.0.1: - resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} - engines: {node: '>=0.10.0'} + serialize-javascript@7.1.1: + resolution: {integrity: sha512-k3CMsaIvvdSwm8oLB4MXSl0wH2/cwlH7xGcnRd2DaeRmBkbzYmyT8j0tsX60DwD1eRwHTpNpH8ljKu9oUT1MeQ==} + engines: {node: '>=20.0.0'} setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} - shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} - signal-exit@3.0.2: - resolution: {integrity: sha512-meQNNykwecVxdu1RlYMKpQx4+wefIYpmxi6gexo/KAbwquJrBUrBmKYJrE8KFkVQAAVWEnwNdu21PgrD77J3xA==} + simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - slice-ansi@2.1.0: - resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} - engines: {node: '>=6'} - - snapdragon-node@2.1.1: - resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} - engines: {node: '>=0.10.0'} - - snapdragon-util@3.0.1: - resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} - engines: {node: '>=0.10.0'} - - snapdragon@0.8.2: - resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} - engines: {node: '>=0.10.0'} - - source-map-resolve@0.5.3: - resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} - deprecated: See https://github.com/lydell/source-map-resolve#deprecated - - source-map-url@0.4.0: - resolution: {integrity: sha512-liJwHPI9x9d9w5WSIjM58MqGmmb7XzNqwdUA3kSBQ4lmDngexlKwawGzK3J1mKXi6+sysoMDlpVyZh9sv5vRfw==} - deprecated: See https://github.com/lydell/source-map-url#deprecated - - source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - split-string@3.1.0: - resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} - engines: {node: '>=0.10.0'} - - split@0.3.3: - resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} - - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - sshpk@1.16.1: - resolution: {integrity: sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==} - engines: {node: '>=0.10.0'} - hasBin: true - - static-extend@0.1.2: - resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} - engines: {node: '>=0.10.0'} - - stream-combiner@0.0.4: - resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} - - string-width@2.1.1: - resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} - engines: {node: '>=4'} - - string-width@3.1.0: - resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} - engines: {node: '>=6'} - - string-width@4.2.0: - resolution: {integrity: sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==} - engines: {node: '>=8'} - - string.prototype.trimend@1.0.1: - resolution: {integrity: sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==} - - string.prototype.trimstart@1.0.1: - resolution: {integrity: sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==} - string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - strip-ansi@4.0.0: - resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} - engines: {node: '>=4'} - - strip-ansi@5.2.0: - resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} - engines: {node: '>=6'} - - strip-ansi@6.0.0: - resolution: {integrity: sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==} + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-eof@1.0.0: - resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} - engines: {node: '>=0.10.0'} - - strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - - strip-json-comments@3.0.1: - resolution: {integrity: sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==} + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-json-comments@5.0.3: + resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} + engines: {node: '>=14.16'} + supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} - supports-color@6.0.0: - resolution: {integrity: sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==} - engines: {node: '>=6'} + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} - table@5.4.6: - resolution: {integrity: sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==} - engines: {node: '>=6.0.0'} + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} - temp-fs@0.9.9: - resolution: {integrity: sha512-WfecDCR1xC9b0nsrzSaxPf3ZuWeWLUWblW4vlDQAa1biQaKHiImHnJfeQocQe/hXKMcolRzgkcVX/7kK4zoWbw==} - engines: {node: '>=0.8.0'} - - term-size@1.2.0: - resolution: {integrity: sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==} - engines: {node: '>=4'} + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - timed-out@4.0.1: - resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} - engines: {node: '>=0.10.0'} + tldts-core@6.1.86: + resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - - tmp@0.2.1: - resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} - engines: {node: '>=8.17.0'} - - to-object-path@0.3.0: - resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} - engines: {node: '>=0.10.0'} + tldts@6.1.86: + resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} + hasBin: true - to-regex-range@2.1.1: - resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} - engines: {node: '>=0.10.0'} + tmp@0.2.7: + resolution: {integrity: sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==} + engines: {node: '>=14.14'} - to-regex@3.0.2: - resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} - engines: {node: '>=0.10.0'} + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} touch@3.1.0: resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} hasBin: true - tough-cookie@2.4.3: - resolution: {integrity: sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==} - engines: {node: '>=0.8'} - - tslib@1.10.0: - resolution: {integrity: sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==} + tough-cookie@5.1.2: + resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} + engines: {node: '>=16'} - tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} - tweetnacl@0.14.5: - resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true - type-check@0.3.2: - resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} - type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} typescript@7.0.2: resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} @@ -1684,147 +1000,94 @@ packages: engines: {node: '>=0.8.0'} hasBin: true - undefsafe@2.0.3: - resolution: {integrity: sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==} + undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} undici-types@7.18.2: resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} - union-value@1.0.1: - resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} - engines: {node: '>=0.10.0'} - - unique-string@1.0.0: - resolution: {integrity: sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==} - engines: {node: '>=4'} - - unset-value@1.0.0: - resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} - engines: {node: '>=0.10.0'} - - unzip-response@2.0.1: - resolution: {integrity: sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==} - engines: {node: '>=4'} - - upath@1.2.0: - resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} - engines: {node: '>=4'} - - update-notifier@2.5.0: - resolution: {integrity: sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==} - engines: {node: '>=4'} - uri-js@4.2.2: resolution: {integrity: sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==} - urix@0.1.0: - resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} - deprecated: Please see https://github.com/lydell/urix#deprecated - - url-parse-lax@1.0.0: - resolution: {integrity: sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==} - engines: {node: '>=0.10.0'} - - use@3.1.1: - resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} - engines: {node: '>=0.10.0'} - util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} uuid-validate@0.0.3: resolution: {integrity: sha512-Fykw5U4eZESbq739BeLvEBFRuJODfrlmjx5eJux7W817LjRaq4b7/i4t2zxQmhcX+fAj4nMfRdTzO4tmwLKn0w==} - uuid@3.4.0: - resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} - deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). - hasBin: true + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} - v8-compile-cache@2.1.0: - resolution: {integrity: sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==} + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} - verror@1.10.0: - resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} - engines: {'0': node >=0.6.0} + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation - which-module@2.0.0: - resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - - wide-align@1.1.3: - resolution: {integrity: sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==} + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} - widest-line@2.0.1: - resolution: {integrity: sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==} - engines: {node: '>=4'} + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true - word-wrap@1.2.3: - resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - wrap-ansi@5.1.0: - resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} - engines: {node: '>=6'} + workerpool@10.0.3: + resolution: {integrity: sha512-6z2Iis68Wqth93/G/wJP9u+R3O+d2XTlgWChGCwuT1qLbBsOYueGRZuJ++v3mtDP5KjYdy+WzvWC+VWETSVXJA==} wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - write-file-atomic@2.4.3: - resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} - - write@1.0.3: - resolution: {integrity: sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==} - engines: {node: '>=4'} - - ws@8.8.1: - resolution: {integrity: sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==} + ws@8.21.3: + resolution: {integrity: sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 + utf-8-validate: '>=5.0.2' peerDependenciesMeta: bufferutil: optional: true utf-8-validate: optional: true - xdg-basedir@3.0.0: - resolution: {integrity: sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==} - engines: {node: '>=4'} - - y18n@4.0.0: - resolution: {integrity: sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==} + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} - yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - yargs-parser@13.1.2: - resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} - - yargs-unparser@1.6.0: - resolution: {integrity: sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==} - engines: {node: '>=6'} - - yargs@13.3.2: - resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} snapshots: - '@babel/code-frame@7.5.5': + '@asamuzakjp/css-color@3.2.0': dependencies: - '@babel/highlight': 7.5.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 10.4.3 - '@babel/highlight@7.5.0': - dependencies: - chalk: 2.4.2 - esutils: 2.0.3 - js-tokens: 4.0.0 + '@bazel/runfiles@6.5.0': {} '@clack/core@1.4.3': dependencies: @@ -1838,17 +1101,76 @@ snapshots: fast-wrap-ansi: 0.2.2 sisteransi: 1.0.5 - '@types/keyv@3.1.4': + '@csstools/color-helpers@5.1.0': {} + + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: - '@types/node': 24.13.3 + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 - '@types/node@24.13.3': + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: - undici-types: 7.18.2 + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 - '@types/responselike@1.0.3': + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': dependencies: - '@types/node': 24.13.3 + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-tokenizer@3.0.4': {} + + '@eslint-community/eslint-utils@4.10.1(eslint@8.57.1(supports-color@5.5.0))': + dependencies: + eslint: 8.57.1(supports-color@5.5.0) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/eslintrc@2.1.4(supports-color@5.5.0)': + dependencies: + ajv: 6.15.0 + debug: 4.3.4(supports-color@5.5.0) + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.2.1 + js-yaml: 4.3.2 + minimatch: 3.1.5 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.1': {} + + '@humanwhocodes/config-array@0.13.0(supports-color@5.5.0)': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.4(supports-color@5.5.0) + minimatch: 3.1.5 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.3 + + '@types/node@24.13.3': + dependencies: + undici-types: 7.18.2 '@typescript/typescript-aix-ppc64@7.0.2': optional: true @@ -1910,13 +1232,13 @@ snapshots: '@typescript/typescript-win32-x64@7.0.2': optional: true + '@ungap/structured-clone@1.4.0': {} + abbrev@1.1.1: {} - acorn-jsx@5.1.0(acorn@7.1.1): + acorn-jsx@5.3.2(acorn@8.18.0): dependencies: - acorn: 7.1.1 - - acorn@7.1.1: {} + acorn: 8.18.0 acorn@8.18.0: {} @@ -1926,519 +1248,228 @@ snapshots: transitivePeerDependencies: - supports-color - ajv@6.10.2: + agent-base@7.1.4: {} + + ajv@6.15.0: dependencies: - fast-deep-equal: 2.0.1 + fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.0.0 json-schema-traverse: 0.4.1 uri-js: 4.2.2 - ansi-align@2.0.0: - dependencies: - string-width: 2.1.1 - - ansi-colors@3.2.3: {} - - ansi-escapes@4.3.0: - dependencies: - type-fest: 0.8.1 - - ansi-regex@3.0.0: {} - - ansi-regex@4.1.0: {} - - ansi-regex@5.0.0: {} + ansi-regex@5.0.1: {} - ansi-styles@3.2.1: + ansi-styles@4.3.0: dependencies: - color-convert: 1.9.3 + color-convert: 2.0.1 - anymatch@2.0.0(supports-color@5.5.0): + anymatch@3.1.3: dependencies: - micromatch: 3.1.10(supports-color@5.5.0) - normalize-path: 2.1.1 - transitivePeerDependencies: - - supports-color - - argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 - - arr-diff@4.0.0: {} - - arr-flatten@1.1.0: {} - - arr-union@3.1.0: {} - - array-unique@0.3.2: {} - - asn1@0.2.4: - dependencies: - safer-buffer: 2.1.2 + normalize-path: 3.0.0 + picomatch: 2.3.2 - assert-plus@1.0.0: {} + argparse@2.0.1: {} assertion-error@1.1.0: {} - assign-symbols@1.0.0: {} - - astral-regex@1.0.0: {} - - async-each@1.0.3: {} - - asynckit@0.4.0: {} - - atob@2.1.2: {} - - aws-sign2@0.7.0: {} - - aws4@1.9.1: {} - balanced-match@1.0.0: {} - base@0.11.2: - dependencies: - cache-base: 1.0.1 - class-utils: 0.3.6 - component-emitter: 1.3.0 - define-property: 1.0.0 - isobject: 3.0.1 - mixin-deep: 1.3.2 - pascalcase: 0.1.1 - - bcrypt-pbkdf@1.0.2: - dependencies: - tweetnacl: 0.14.5 + balanced-match@4.0.4: {} - binary-extensions@1.13.1: {} + binary-extensions@2.3.0: {} - bindings@1.5.0: + brace-expansion@1.1.21: dependencies: - file-uri-to-path: 1.0.0 - optional: true + balanced-match: 1.0.0 + concat-map: 0.0.1 - boxen@1.3.0: + brace-expansion@5.0.12: dependencies: - ansi-align: 2.0.0 - camelcase: 4.1.0 - chalk: 2.4.2 - cli-boxes: 1.0.0 - string-width: 2.1.1 - term-size: 1.2.0 - widest-line: 2.0.1 + balanced-match: 4.0.4 - brace-expansion@1.1.11: + braces@3.0.3: dependencies: - balanced-match: 1.0.0 - concat-map: 0.0.1 - - braces@2.3.2(supports-color@5.5.0): - dependencies: - arr-flatten: 1.1.0 - array-unique: 0.3.2 - extend-shallow: 2.0.1 - fill-range: 4.0.0 - isobject: 3.0.1 - repeat-element: 1.1.3 - snapdragon: 0.8.2(supports-color@5.5.0) - snapdragon-node: 2.1.1 - split-string: 3.1.0 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color + fill-range: 7.1.1 browser-stdout@1.3.1: {} - browserstack-local@1.5.1(supports-color@5.5.0): + browserstack-local@1.5.14(supports-color@5.5.0): dependencies: agent-base: 6.0.2(supports-color@5.5.0) https-proxy-agent: 5.0.1(supports-color@5.5.0) is-running: 2.1.0 - ps-tree: 1.2.0 - temp-fs: 0.9.9 + tree-kill: 1.2.2 transitivePeerDependencies: - supports-color - cache-base@1.0.1: - dependencies: - collection-visit: 1.0.0 - component-emitter: 1.3.0 - get-value: 2.0.6 - has-value: 1.0.0 - isobject: 3.0.1 - set-value: 2.0.1 - to-object-path: 0.3.0 - union-value: 1.0.1 - unset-value: 1.0.0 - callsites@3.1.0: {} - camelcase@4.1.0: {} - - camelcase@5.3.1: {} - - capture-stack-trace@1.0.1: {} - - caseless@0.12.0: {} - - chai@4.2.0: + chai@4.5.0: dependencies: assertion-error: 1.1.0 - check-error: 1.0.2 - deep-eql: 3.0.1 - get-func-name: 2.0.0 - pathval: 1.1.0 - type-detect: 4.0.8 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.1.0 - chalk@2.4.2: + chalk@4.1.2: dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 + ansi-styles: 4.3.0 + supports-color: 7.2.0 - chardet@0.7.0: {} - - check-error@1.0.2: {} + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 - chokidar@2.1.8(supports-color@5.5.0): + chokidar@3.6.0: dependencies: - anymatch: 2.0.0(supports-color@5.5.0) - async-each: 1.0.3 - braces: 2.3.2(supports-color@5.5.0) - glob-parent: 3.1.0 - inherits: 2.0.4 - is-binary-path: 1.0.1 + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 is-glob: 4.0.1 normalize-path: 3.0.0 - path-is-absolute: 1.0.1 - readdirp: 2.2.1(supports-color@5.5.0) - upath: 1.2.0 + readdirp: 3.6.0 optionalDependencies: - fsevents: 1.2.13 - transitivePeerDependencies: - - supports-color - - ci-info@1.6.0: {} + fsevents: 2.3.3 - class-utils@0.3.6: + chokidar@5.0.0: dependencies: - arr-union: 3.1.0 - define-property: 0.2.5 - isobject: 3.0.1 - static-extend: 0.1.2 + readdirp: 5.1.1 - cli-boxes@1.0.0: {} - - cli-cursor@3.1.0: + color-convert@2.0.1: dependencies: - restore-cursor: 3.1.0 - - cli-width@2.2.0: {} + color-name: 1.1.4 - cliui@5.0.0: - dependencies: - string-width: 3.1.0 - strip-ansi: 5.2.0 - wrap-ansi: 5.1.0 - - collection-visit@1.0.0: - dependencies: - map-visit: 1.0.0 - object-visit: 1.0.1 - - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - - color-name@1.1.3: {} - - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 + color-name@1.1.4: {} commander@2.20.3: {} - component-emitter@1.3.0: {} - concat-map@0.0.1: {} - configstore@3.1.2: - dependencies: - dot-prop: 4.2.0 - graceful-fs: 4.2.1 - make-dir: 1.3.0 - unique-string: 1.0.0 - write-file-atomic: 2.4.3 - xdg-basedir: 3.0.0 - - copy-descriptor@0.1.1: {} - core-util-is@1.0.2: {} - create-error-class@3.0.2: - dependencies: - capture-stack-trace: 1.0.1 - - cross-spawn@5.1.0: + cross-spawn@7.0.6: dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 - cross-spawn@6.0.5: + cssstyle@4.6.0: dependencies: - nice-try: 1.0.5 - path-key: 2.0.1 - semver: 5.7.1 - shebang-command: 1.2.0 - which: 1.3.1 - - crypto-random-string@1.0.0: {} + '@asamuzakjp/css-color': 3.2.0 + rrweb-cssom: 0.8.0 - dashdash@1.14.1: + data-urls@5.0.0: dependencies: - assert-plus: 1.0.0 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 - debug@2.6.9(supports-color@5.5.0): - dependencies: - ms: 2.0.0 - optionalDependencies: - supports-color: 5.5.0 - - debug@3.2.6(supports-color@5.5.0): + debug@4.3.4(supports-color@5.5.0): dependencies: ms: 2.1.2 optionalDependencies: supports-color: 5.5.0 - debug@3.2.6(supports-color@6.0.0): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 6.0.0 - - debug@4.3.4(supports-color@5.5.0): + debug@4.4.3(supports-color@8.1.1): dependencies: - ms: 2.1.2 + ms: 2.1.3 optionalDependencies: - supports-color: 5.5.0 + supports-color: 8.1.1 - decamelize@1.2.0: {} + decimal.js@10.6.0: {} - decode-uri-component@0.2.0: {} - - deep-eql@3.0.1: + deep-eql@4.1.4: dependencies: type-detect: 4.0.8 - deep-extend@0.6.0: {} - deep-is@0.1.3: {} - define-properties@1.1.3: - dependencies: - object-keys: 1.1.1 - - define-property@0.2.5: - dependencies: - is-descriptor: 0.1.6 - - define-property@1.0.0: - dependencies: - is-descriptor: 1.0.2 - - define-property@2.0.2: - dependencies: - is-descriptor: 1.0.2 - isobject: 3.0.1 - - delayed-stream@1.0.0: {} - - diff@3.5.0: {} + diff@9.0.0: {} doctrine@3.0.0: dependencies: esutils: 2.0.3 - dot-prop@4.2.0: - dependencies: - is-obj: 1.0.1 - dotenv@8.2.0: {} - duplexer3@0.1.4: {} + entities@6.0.1: {} - duplexer@0.1.2: {} - - ecc-jsbn@0.1.2: - dependencies: - jsbn: 0.1.1 - safer-buffer: 2.1.2 - - emoji-regex@7.0.3: {} - - emoji-regex@8.0.0: {} - - es-abstract@1.17.6: - dependencies: - es-to-primitive: 1.2.1 - function-bind: 1.1.1 - has: 1.0.3 - has-symbols: 1.0.1 - is-callable: 1.2.0 - is-regex: 1.1.0 - object-inspect: 1.7.0 - object-keys: 1.1.1 - object.assign: 4.1.0 - string.prototype.trimend: 1.0.1 - string.prototype.trimstart: 1.0.1 + escape-string-regexp@4.0.0: {} - es-to-primitive@1.2.1: + eslint-scope@7.2.2: dependencies: - is-callable: 1.2.0 - is-date-object: 1.0.2 - is-symbol: 1.0.3 + esrecurse: 4.3.0 + estraverse: 5.3.0 - escape-string-regexp@1.0.5: {} + eslint-visitor-keys@3.4.3: {} - eslint-scope@5.0.0: + eslint@8.57.1(supports-color@5.5.0): dependencies: - esrecurse: 4.2.1 - estraverse: 4.3.0 - - eslint-utils@1.4.3: - dependencies: - eslint-visitor-keys: 1.1.0 - - eslint-visitor-keys@1.1.0: {} - - eslint@6.7.2(supports-color@5.5.0): - dependencies: - '@babel/code-frame': 7.5.5 - ajv: 6.10.2 - chalk: 2.4.2 - cross-spawn: 6.0.5 + '@eslint-community/eslint-utils': 4.10.1(eslint@8.57.1(supports-color@5.5.0)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/eslintrc': 2.1.4(supports-color@5.5.0) + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0(supports-color@5.5.0) + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.4.0 + ajv: 6.15.0 + chalk: 4.1.2 + cross-spawn: 7.0.6 debug: 4.3.4(supports-color@5.5.0) doctrine: 3.0.0 - eslint-scope: 5.0.0 - eslint-utils: 1.4.3 - eslint-visitor-keys: 1.1.0 - espree: 6.1.2 - esquery: 1.0.1 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.7.0 esutils: 2.0.3 - file-entry-cache: 5.0.1 - functional-red-black-tree: 1.0.1 - glob-parent: 5.1.0 - globals: 12.3.0 - ignore: 4.0.6 - import-fresh: 3.2.1 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 imurmurhash: 0.1.4 - inquirer: 7.0.0 is-glob: 4.0.1 - js-yaml: 3.13.1 + is-path-inside: 3.0.3 + js-yaml: 4.3.2 json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.3.0 - lodash: 4.17.15 - minimatch: 3.0.4 - mkdirp: 0.5.5 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.5 natural-compare: 1.4.0 - optionator: 0.8.3 - progress: 2.0.3 - regexpp: 2.0.1 - semver: 6.3.0 - strip-ansi: 5.2.0 - strip-json-comments: 3.0.1 - table: 5.4.6 + optionator: 0.9.4 + strip-ansi: 6.0.1 text-table: 0.2.0 - v8-compile-cache: 2.1.0 transitivePeerDependencies: - supports-color - espree@6.1.2: + espree@9.6.1: dependencies: - acorn: 7.1.1 - acorn-jsx: 5.1.0(acorn@7.1.1) - eslint-visitor-keys: 1.1.0 + acorn: 8.18.0 + acorn-jsx: 5.3.2(acorn@8.18.0) + eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} - esquery@1.0.1: + esquery@1.7.0: dependencies: - estraverse: 4.3.0 + estraverse: 5.3.0 - esrecurse@4.2.1: + esrecurse@4.3.0: dependencies: - estraverse: 4.3.0 + estraverse: 5.3.0 - estraverse@4.3.0: {} + estraverse@5.3.0: {} esutils@2.0.3: {} - event-stream@3.3.4: - dependencies: - duplexer: 0.1.2 - from: 0.1.7 - map-stream: 0.1.0 - pause-stream: 0.0.11 - split: 0.3.3 - stream-combiner: 0.0.4 - through: 2.3.8 - - execa@0.7.0: - dependencies: - cross-spawn: 5.1.0 - get-stream: 3.0.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.2 - strip-eof: 1.0.0 - - expand-brackets@2.1.4(supports-color@5.5.0): - dependencies: - debug: 2.6.9(supports-color@5.5.0) - define-property: 0.2.5 - extend-shallow: 2.0.1 - posix-character-classes: 0.1.1 - regex-not: 1.0.2 - snapdragon: 0.8.2(supports-color@5.5.0) - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - - extend-shallow@2.0.1: - dependencies: - is-extendable: 0.1.1 - - extend-shallow@3.0.2: - dependencies: - assign-symbols: 1.0.0 - is-extendable: 1.0.1 - - extend@3.0.2: {} - - external-editor@3.1.0: - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - - extglob@2.0.4(supports-color@5.5.0): - dependencies: - array-unique: 0.3.2 - define-property: 1.0.0 - expand-brackets: 2.1.4(supports-color@5.5.0) - extend-shallow: 2.0.1 - fragment-cache: 0.2.1 - regex-not: 1.0.2 - snapdragon: 0.8.2(supports-color@5.5.0) - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - - extsprintf@1.3.0: {} - - fast-deep-equal@2.0.1: {} + fast-deep-equal@3.1.3: {} fast-json-stable-stringify@2.0.0: {} @@ -2454,185 +1485,92 @@ snapshots: dependencies: fast-string-width: 3.0.2 - figures@3.1.0: + fastq@1.20.3: dependencies: - escape-string-regexp: 1.0.5 + reusify: 1.1.0 - file-entry-cache@5.0.1: + file-entry-cache@6.0.1: dependencies: - flat-cache: 2.0.1 + flat-cache: 3.2.0 - file-uri-to-path@1.0.0: - optional: true - - fill-range@4.0.0: - dependencies: - extend-shallow: 2.0.1 - is-number: 3.0.0 - repeat-string: 1.6.1 - to-regex-range: 2.1.1 - - find-up@3.0.0: + fill-range@7.1.1: dependencies: - locate-path: 3.0.0 + to-regex-range: 5.0.1 - flat-cache@2.0.1: - dependencies: - flatted: 2.0.1 - rimraf: 2.6.3 - write: 1.0.3 + find-up-simple@1.0.1: {} - flat@4.1.0: + find-up@5.0.0: dependencies: - is-buffer: 2.0.4 - - flatted@2.0.1: {} - - for-in@1.0.2: {} - - forever-agent@0.6.1: {} + locate-path: 6.0.0 + path-exists: 4.0.0 - form-data@2.3.3: + flat-cache@3.2.0: dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.26 - - fragment-cache@0.2.1: - dependencies: - map-cache: 0.2.2 + flatted: 3.4.4 + keyv: 4.5.4 + rimraf: 3.0.2 - from@0.1.7: {} + flatted@3.4.4: {} fs.realpath@1.0.0: {} - fsevents@1.2.13: - dependencies: - bindings: 1.5.0 - nan: 2.14.1 + fsevents@2.3.3: optional: true - function-bind@1.1.1: {} - - functional-red-black-tree@1.0.1: {} - - get-caller-file@2.0.5: {} - - get-func-name@2.0.0: {} + get-func-name@2.0.2: {} - get-stream@3.0.0: {} - - get-value@2.0.6: {} - - getpass@0.1.7: - dependencies: - assert-plus: 1.0.0 - - glob-parent@3.1.0: + glob-parent@5.1.2: dependencies: - is-glob: 3.1.0 - path-dirname: 1.0.2 + is-glob: 4.0.1 - glob-parent@5.1.0: + glob-parent@6.0.2: dependencies: - is-glob: 4.0.1 + is-glob: 4.0.3 - glob@7.1.3: + glob@13.0.6: dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.0.4 - once: 1.4.0 - path-is-absolute: 1.0.1 + minimatch: 10.2.6 + minipass: 7.1.3 + path-scurry: 2.0.2 glob@7.1.6: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 3.0.4 + minimatch: 3.1.5 once: 1.4.0 path-is-absolute: 1.0.1 - global-dirs@0.1.1: + globals@13.24.0: dependencies: - ini: 1.3.5 + type-fest: 0.20.2 - globals@12.3.0: - dependencies: - type-fest: 0.8.1 + graphemer@1.4.0: {} - got@6.7.1: + handlebars@4.7.9: dependencies: - '@types/keyv': 3.1.4 - '@types/responselike': 1.0.3 - create-error-class: 3.0.2 - duplexer3: 0.1.4 - get-stream: 3.0.0 - is-redirect: 1.0.0 - is-retry-allowed: 1.1.0 - is-stream: 1.1.0 - lowercase-keys: 1.0.1 - safe-buffer: 5.1.2 - timed-out: 4.0.1 - unzip-response: 2.0.1 - url-parse-lax: 1.0.0 - - graceful-fs@4.2.1: {} - - growl@1.10.5: {} - - handlebars@4.7.6: - dependencies: - minimist: 1.2.5 - neo-async: 2.6.1 + minimist: 1.2.8 + neo-async: 2.6.2 source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: uglify-js: 3.9.4 - har-schema@2.0.0: {} - - har-validator@5.1.3: - dependencies: - ajv: 6.10.2 - har-schema: 2.0.0 - has-flag@3.0.0: {} - has-symbols@1.0.1: {} + has-flag@4.0.0: {} - has-value@0.3.1: + html-encoding-sniffer@4.0.0: dependencies: - get-value: 2.0.6 - has-values: 0.1.4 - isobject: 2.1.0 + whatwg-encoding: 3.1.1 - has-value@1.0.0: + http-proxy-agent@7.0.2(supports-color@5.5.0): dependencies: - get-value: 2.0.6 - has-values: 1.0.0 - isobject: 3.0.1 - - has-values@0.1.4: {} - - has-values@1.0.0: - dependencies: - is-number: 3.0.0 - kind-of: 4.0.0 - - has@1.0.3: - dependencies: - function-bind: 1.1.1 - - he@1.2.0: {} - - http-signature@1.2.0: - dependencies: - assert-plus: 1.0.0 - jsprim: 1.4.1 - sshpk: 1.16.1 + agent-base: 7.1.4 + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color https-proxy-agent@5.0.1(supports-color@5.5.0): dependencies: @@ -2641,13 +1579,20 @@ snapshots: transitivePeerDependencies: - supports-color - iconv-lite@0.4.24: + https-proxy-agent@7.0.6(supports-color@5.5.0): + dependencies: + agent-base: 7.1.4 + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 ignore-by-default@1.0.1: {} - ignore@4.0.6: {} + ignore@5.3.2: {} immediate@3.0.6: {} @@ -2656,8 +1601,6 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 - import-lazy@2.1.0: {} - imurmurhash@0.1.4: {} inflight@1.0.6: @@ -2667,434 +1610,191 @@ snapshots: inherits@2.0.4: {} - ini@1.3.5: {} - - inquirer@7.0.0: - dependencies: - ansi-escapes: 4.3.0 - chalk: 2.4.2 - cli-cursor: 3.1.0 - cli-width: 2.2.0 - external-editor: 3.1.0 - figures: 3.1.0 - lodash: 4.17.15 - mute-stream: 0.0.8 - run-async: 2.3.0 - rxjs: 6.5.3 - string-width: 4.2.0 - strip-ansi: 5.2.0 - through: 2.3.8 - - is-accessor-descriptor@0.1.6: - dependencies: - kind-of: 3.2.2 - - is-accessor-descriptor@1.0.0: - dependencies: - kind-of: 6.0.3 - - is-binary-path@1.0.1: - dependencies: - binary-extensions: 1.13.1 - - is-buffer@1.1.6: {} - - is-buffer@2.0.4: {} - - is-callable@1.2.0: {} - - is-ci@1.2.1: - dependencies: - ci-info: 1.6.0 - - is-data-descriptor@0.1.4: - dependencies: - kind-of: 3.2.2 - - is-data-descriptor@1.0.0: - dependencies: - kind-of: 6.0.3 - - is-date-object@1.0.2: {} - - is-descriptor@0.1.6: - dependencies: - is-accessor-descriptor: 0.1.6 - is-data-descriptor: 0.1.4 - kind-of: 5.1.0 - - is-descriptor@1.0.2: - dependencies: - is-accessor-descriptor: 1.0.0 - is-data-descriptor: 1.0.0 - kind-of: 6.0.3 - - is-extendable@0.1.1: {} - - is-extendable@1.0.1: + is-binary-path@2.1.0: dependencies: - is-plain-object: 2.0.4 + binary-extensions: 2.3.0 is-extglob@2.1.1: {} - is-fullwidth-code-point@2.0.0: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@3.1.0: - dependencies: - is-extglob: 2.1.1 - is-glob@4.0.1: dependencies: is-extglob: 2.1.1 - is-installed-globally@0.1.0: - dependencies: - global-dirs: 0.1.1 - is-path-inside: 1.0.1 - - is-npm@1.0.0: {} - - is-number@3.0.0: - dependencies: - kind-of: 3.2.2 - - is-obj@1.0.1: {} - - is-path-inside@1.0.1: + is-glob@4.0.3: dependencies: - path-is-inside: 1.0.2 - - is-plain-object@2.0.4: - dependencies: - isobject: 3.0.1 + is-extglob: 2.1.1 - is-promise@2.1.0: {} + is-number@7.0.0: {} - is-redirect@1.0.0: {} + is-path-inside@3.0.3: {} - is-regex@1.1.0: - dependencies: - has-symbols: 1.0.1 + is-path-inside@4.0.0: {} - is-retry-allowed@1.1.0: {} + is-potential-custom-element-name@1.0.1: {} is-running@2.1.0: {} - is-stream@1.1.0: {} - - is-symbol@1.0.3: - dependencies: - has-symbols: 1.0.1 - - is-typedarray@1.0.0: {} - - is-windows@1.0.2: {} + is-unicode-supported@0.1.0: {} isarray@1.0.0: {} isexe@2.0.0: {} - isobject@2.1.0: - dependencies: - isarray: 1.0.0 - - isobject@3.0.1: {} - - isstream@0.1.2: {} - - js-tokens@4.0.0: {} - - js-yaml@3.13.1: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 + js-yaml@4.3.2: + dependencies: + argparse: 2.0.1 + + js-yaml@5.4.2: + dependencies: + argparse: 2.0.1 + + jsdom@26.1.0(supports-color@5.5.0): + dependencies: + cssstyle: 4.6.0 + data-urls: 5.0.0 + decimal.js: 10.6.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2(supports-color@5.5.0) + https-proxy-agent: 7.0.6(supports-color@5.5.0) + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.28 + parse5: 7.3.0 + rrweb-cssom: 0.8.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 5.1.2 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + ws: 8.21.3 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate - jsbn@0.1.1: {} + json-buffer@3.0.1: {} json-schema-traverse@0.4.1: {} - json-schema@0.2.3: {} - json-stable-stringify-without-jsonify@1.0.1: {} - json-stringify-safe@5.0.1: {} - - jsprim@1.4.1: - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.2.3 - verror: 1.10.0 - - jszip@3.10.0: + jszip@3.10.2: dependencies: lie: 3.3.0 pako: 1.0.11 readable-stream: 2.3.6 setimmediate: 1.0.5 - kind-of@3.2.2: - dependencies: - is-buffer: 1.1.6 - - kind-of@4.0.0: - dependencies: - is-buffer: 1.1.6 - - kind-of@5.1.0: {} - - kind-of@6.0.3: {} - - latest-version@3.1.0: + keyv@4.5.4: dependencies: - package-json: 4.0.1 + json-buffer: 3.0.1 - levn@0.3.0: + levn@0.4.1: dependencies: - prelude-ls: 1.1.2 - type-check: 0.3.2 + prelude-ls: 1.2.1 + type-check: 0.4.0 lie@3.3.0: dependencies: immediate: 3.0.6 - locate-path@3.0.0: - dependencies: - p-locate: 3.0.0 - path-exists: 3.0.0 - - lodash@4.17.15: {} - - log-symbols@2.2.0: - dependencies: - chalk: 2.4.2 - - lowercase-keys@1.0.1: {} - - lru-cache@4.1.5: - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - - make-dir@1.3.0: + locate-path@6.0.0: dependencies: - pify: 3.0.0 - - map-cache@0.2.2: {} + p-locate: 5.0.0 - map-stream@0.1.0: {} - - map-visit@1.0.0: - dependencies: - object-visit: 1.0.1 + lodash.merge@4.6.2: {} - micromatch@3.1.10(supports-color@5.5.0): + loupe@2.3.7: dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - braces: 2.3.2(supports-color@5.5.0) - define-property: 2.0.2 - extend-shallow: 3.0.2 - extglob: 2.0.4(supports-color@5.5.0) - fragment-cache: 0.2.1 - kind-of: 6.0.3 - nanomatch: 1.2.13(supports-color@5.5.0) - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2(supports-color@5.5.0) - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color + get-func-name: 2.0.2 - mime-db@1.43.0: {} - - mime-types@2.1.26: - dependencies: - mime-db: 1.43.0 + lru-cache@10.4.3: {} - mimic-fn@2.1.0: {} + lru-cache@11.5.3: {} - minimatch@3.0.4: + minimatch@10.2.6: dependencies: - brace-expansion: 1.1.11 + brace-expansion: 5.0.12 - minimist@1.2.5: {} - - mixin-deep@1.3.2: + minimatch@3.1.5: dependencies: - for-in: 1.0.2 - is-extendable: 1.0.1 + brace-expansion: 1.1.21 - mkdirp@0.5.4: - dependencies: - minimist: 1.2.5 + minimist@1.2.8: {} - mkdirp@0.5.5: - dependencies: - minimist: 1.2.5 + minipass@7.1.3: {} - mocha@6.2.3: + mocha@12.0.2: dependencies: - ansi-colors: 3.2.3 browser-stdout: 1.3.1 - debug: 3.2.6(supports-color@6.0.0) - diff: 3.5.0 - escape-string-regexp: 1.0.5 - find-up: 3.0.0 - glob: 7.1.3 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 3.13.1 - log-symbols: 2.2.0 - minimatch: 3.0.4 - mkdirp: 0.5.4 - ms: 2.1.1 - node-environment-flags: 1.0.5 - object.assign: 4.1.0 - strip-json-comments: 2.0.1 - supports-color: 6.0.0 - which: 1.3.1 - wide-align: 1.1.3 - yargs: 13.3.2 - yargs-parser: 13.1.2 - yargs-unparser: 1.6.0 - - ms@2.0.0: {} - - ms@2.1.1: {} + chokidar: 5.0.0 + debug: 4.4.3(supports-color@8.1.1) + diff: 9.0.0 + find-up-simple: 1.0.1 + glob: 13.0.6 + is-path-inside: 4.0.0 + is-unicode-supported: 0.1.0 + js-yaml: 5.4.2 + minimatch: 10.2.6 + ms: 2.1.3 + picocolors: 1.1.1 + serialize-javascript: 7.1.1 + strip-json-comments: 5.0.3 + supports-color: 8.1.1 + workerpool: 10.0.3 ms@2.1.2: {} - mute-stream@0.0.8: {} - - nan@2.14.1: - optional: true - - nanomatch@1.2.13(supports-color@5.5.0): - dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - define-property: 2.0.2 - extend-shallow: 3.0.2 - fragment-cache: 0.2.1 - is-windows: 1.0.2 - kind-of: 6.0.3 - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2(supports-color@5.5.0) - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color + ms@2.1.3: {} natural-compare@1.4.0: {} - neo-async@2.6.1: {} + neo-async@2.6.2: {} - nice-try@1.0.5: {} - - node-environment-flags@1.0.5: - dependencies: - object.getownpropertydescriptors: 2.1.0 - semver: 5.7.1 - - nodemon@1.19.4: + nodemon@3.1.14: dependencies: - chokidar: 2.1.8(supports-color@5.5.0) - debug: 3.2.6(supports-color@5.5.0) + chokidar: 3.6.0 + debug: 4.3.4(supports-color@5.5.0) ignore-by-default: 1.0.1 - minimatch: 3.0.4 + minimatch: 10.2.6 pstree.remy: 1.1.8 - semver: 5.7.1 + semver: 7.8.5 + simple-update-notifier: 2.0.0 supports-color: 5.5.0 touch: 3.1.0 - undefsafe: 2.0.3(supports-color@5.5.0) - update-notifier: 2.5.0 + undefsafe: 2.0.5 nopt@1.0.10: dependencies: abbrev: 1.1.1 - normalize-path@2.1.1: - dependencies: - remove-trailing-separator: 1.1.0 - normalize-path@3.0.0: {} - npm-run-path@2.0.2: - dependencies: - path-key: 2.0.1 - - oauth-sign@0.9.0: {} - - object-copy@0.1.0: - dependencies: - copy-descriptor: 0.1.1 - define-property: 0.2.5 - kind-of: 3.2.2 - - object-inspect@1.7.0: {} - - object-keys@1.1.1: {} - - object-visit@1.0.1: - dependencies: - isobject: 3.0.1 - - object.assign@4.1.0: - dependencies: - define-properties: 1.1.3 - function-bind: 1.1.1 - has-symbols: 1.0.1 - object-keys: 1.1.1 - - object.getownpropertydescriptors@2.1.0: - dependencies: - define-properties: 1.1.3 - es-abstract: 1.17.6 - - object.pick@1.3.0: - dependencies: - isobject: 3.0.1 + nwsapi@2.2.28: {} once@1.4.0: dependencies: wrappy: 1.0.2 - onetime@5.1.0: - dependencies: - mimic-fn: 2.1.0 - - optionator@0.8.3: + optionator@0.9.4: dependencies: deep-is: 0.1.3 fast-levenshtein: 2.0.6 - levn: 0.3.0 - prelude-ls: 1.1.2 - type-check: 0.3.2 - word-wrap: 1.2.3 - - os-tmpdir@1.0.2: {} - - p-finally@1.0.0: {} + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 - p-limit@2.2.2: + p-limit@3.1.0: dependencies: - p-try: 2.2.0 + yocto-queue: 0.1.0 - p-locate@3.0.0: + p-locate@5.0.0: dependencies: - p-limit: 2.2.2 - - p-try@2.2.0: {} - - package-json@4.0.1: - dependencies: - got: 6.7.1 - registry-auth-token: 3.4.0 - registry-url: 3.1.0 - semver: 5.7.1 + p-limit: 3.1.0 pako@1.0.11: {} @@ -3102,60 +1802,36 @@ snapshots: dependencies: callsites: 3.1.0 - pascalcase@0.1.1: {} - - path-dirname@1.0.2: {} + parse5@7.3.0: + dependencies: + entities: 6.0.1 - path-exists@3.0.0: {} + path-exists@4.0.0: {} path-is-absolute@1.0.1: {} - path-is-inside@1.0.2: {} - - path-key@2.0.1: {} + path-key@3.1.1: {} - pathval@1.1.0: {} - - pause-stream@0.0.11: + path-scurry@2.0.2: dependencies: - through: 2.3.8 - - performance-now@2.1.0: {} + lru-cache: 11.5.3 + minipass: 7.1.3 - pify@3.0.0: {} + pathval@1.1.1: {} - posix-character-classes@0.1.1: {} + picocolors@1.1.1: {} - prelude-ls@1.1.2: {} + picomatch@2.3.2: {} - prepend-http@1.0.4: {} + prelude-ls@1.2.1: {} process-nextick-args@2.0.1: {} - progress@2.0.3: {} - - ps-tree@1.2.0: - dependencies: - event-stream: 3.3.4 - - pseudomap@1.0.2: {} - - psl@1.7.0: {} - pstree.remy@1.1.8: {} - punycode@1.4.1: {} - - punycode@2.1.1: {} + punycode@2.3.1: {} - qs@6.5.2: {} - - rc@1.2.8: - dependencies: - deep-extend: 0.6.0 - ini: 1.3.5 - minimist: 1.2.5 - strip-json-comments: 2.0.1 + queue-microtask@1.2.3: {} readable-stream@2.3.6: dependencies: @@ -3167,340 +1843,127 @@ snapshots: string_decoder: 1.1.1 util-deprecate: 1.0.2 - readdirp@2.2.1(supports-color@5.5.0): + readdirp@3.6.0: dependencies: - graceful-fs: 4.2.1 - micromatch: 3.1.10(supports-color@5.5.0) - readable-stream: 2.3.6 - transitivePeerDependencies: - - supports-color - - regex-not@1.0.2: - dependencies: - extend-shallow: 3.0.2 - safe-regex: 1.1.0 - - regexpp@2.0.1: {} - - registry-auth-token@3.4.0: - dependencies: - rc: 1.2.8 - safe-buffer: 5.1.2 - - registry-url@3.1.0: - dependencies: - rc: 1.2.8 - - remove-trailing-separator@1.1.0: {} - - repeat-element@1.1.3: {} - - repeat-string@1.6.1: {} - - request@2.88.0: - dependencies: - aws-sign2: 0.7.0 - aws4: 1.9.1 - caseless: 0.12.0 - combined-stream: 1.0.8 - extend: 3.0.2 - forever-agent: 0.6.1 - form-data: 2.3.3 - har-validator: 5.1.3 - http-signature: 1.2.0 - is-typedarray: 1.0.0 - isstream: 0.1.2 - json-stringify-safe: 5.0.1 - mime-types: 2.1.26 - oauth-sign: 0.9.0 - performance-now: 2.1.0 - qs: 6.5.2 - safe-buffer: 5.1.2 - tough-cookie: 2.4.3 - tunnel-agent: 0.6.0 - uuid: 3.4.0 - - require-directory@2.1.1: {} + picomatch: 2.3.2 - require-main-filename@2.0.0: {} + readdirp@5.1.1: {} resolve-from@4.0.0: {} - resolve-url@0.2.1: {} - - restore-cursor@3.1.0: - dependencies: - onetime: 5.1.0 - signal-exit: 3.0.2 - - ret@0.1.15: {} - - rimraf@2.5.4: - dependencies: - glob: 7.1.6 - - rimraf@2.6.3: - dependencies: - glob: 7.1.6 + reusify@1.1.0: {} rimraf@3.0.2: dependencies: glob: 7.1.6 - run-async@2.3.0: - dependencies: - is-promise: 2.1.0 + rrweb-cssom@0.8.0: {} - rxjs@6.5.3: + run-parallel@1.2.0: dependencies: - tslib: 1.10.0 + queue-microtask: 1.2.3 safe-buffer@5.1.2: {} - safe-regex@1.1.0: - dependencies: - ret: 0.1.15 - safer-buffer@2.1.2: {} - selenium-webdriver@4.3.1: + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + + selenium-webdriver@4.49.0: dependencies: - jszip: 3.10.0 - tmp: 0.2.1 - ws: 8.8.1 + '@bazel/runfiles': 6.5.0 + jszip: 3.10.2 + tmp: 0.2.7 + ws: 8.21.3 transitivePeerDependencies: - bufferutil - utf-8-validate - semver-diff@2.1.0: - dependencies: - semver: 5.7.1 - - semver@5.7.1: {} - - semver@6.3.0: {} - - set-blocking@2.0.0: {} + semver@7.8.5: {} - set-value@2.0.1: - dependencies: - extend-shallow: 2.0.1 - is-extendable: 0.1.1 - is-plain-object: 2.0.4 - split-string: 3.1.0 + serialize-javascript@7.1.1: {} setimmediate@1.0.5: {} - shebang-command@1.2.0: - dependencies: - shebang-regex: 1.0.0 - - shebang-regex@1.0.0: {} - - signal-exit@3.0.2: {} - - sisteransi@1.0.5: {} - - slice-ansi@2.1.0: - dependencies: - ansi-styles: 3.2.1 - astral-regex: 1.0.0 - is-fullwidth-code-point: 2.0.0 - - snapdragon-node@2.1.1: - dependencies: - define-property: 1.0.0 - isobject: 3.0.1 - snapdragon-util: 3.0.1 - - snapdragon-util@3.0.1: + shebang-command@2.0.0: dependencies: - kind-of: 3.2.2 + shebang-regex: 3.0.0 - snapdragon@0.8.2(supports-color@5.5.0): - dependencies: - base: 0.11.2 - debug: 2.6.9(supports-color@5.5.0) - define-property: 0.2.5 - extend-shallow: 2.0.1 - map-cache: 0.2.2 - source-map: 0.5.7 - source-map-resolve: 0.5.3 - use: 3.1.1 - transitivePeerDependencies: - - supports-color + shebang-regex@3.0.0: {} - source-map-resolve@0.5.3: + simple-update-notifier@2.0.0: dependencies: - atob: 2.1.2 - decode-uri-component: 0.2.0 - resolve-url: 0.2.1 - source-map-url: 0.4.0 - urix: 0.1.0 + semver: 7.8.5 - source-map-url@0.4.0: {} - - source-map@0.5.7: {} + sisteransi@1.0.5: {} source-map@0.6.1: {} - split-string@3.1.0: - dependencies: - extend-shallow: 3.0.2 - - split@0.3.3: - dependencies: - through: 2.3.8 - - sprintf-js@1.0.3: {} - - sshpk@1.16.1: - dependencies: - asn1: 0.2.4 - assert-plus: 1.0.0 - bcrypt-pbkdf: 1.0.2 - dashdash: 1.14.1 - ecc-jsbn: 0.1.2 - getpass: 0.1.7 - jsbn: 0.1.1 - safer-buffer: 2.1.2 - tweetnacl: 0.14.5 - - static-extend@0.1.2: - dependencies: - define-property: 0.2.5 - object-copy: 0.1.0 - - stream-combiner@0.0.4: - dependencies: - duplexer: 0.1.2 - - string-width@2.1.1: - dependencies: - is-fullwidth-code-point: 2.0.0 - strip-ansi: 4.0.0 - - string-width@3.1.0: - dependencies: - emoji-regex: 7.0.3 - is-fullwidth-code-point: 2.0.0 - strip-ansi: 5.2.0 - - string-width@4.2.0: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.0 - - string.prototype.trimend@1.0.1: - dependencies: - define-properties: 1.1.3 - es-abstract: 1.17.6 - - string.prototype.trimstart@1.0.1: - dependencies: - define-properties: 1.1.3 - es-abstract: 1.17.6 - string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 - strip-ansi@4.0.0: - dependencies: - ansi-regex: 3.0.0 - - strip-ansi@5.2.0: + strip-ansi@6.0.1: dependencies: - ansi-regex: 4.1.0 + ansi-regex: 5.0.1 - strip-ansi@6.0.0: - dependencies: - ansi-regex: 5.0.0 - - strip-eof@1.0.0: {} + strip-json-comments@3.1.1: {} - strip-json-comments@2.0.1: {} - - strip-json-comments@3.0.1: {} + strip-json-comments@5.0.3: {} supports-color@5.5.0: dependencies: has-flag: 3.0.0 - supports-color@6.0.0: - dependencies: - has-flag: 3.0.0 - - table@5.4.6: + supports-color@7.2.0: dependencies: - ajv: 6.10.2 - lodash: 4.17.15 - slice-ansi: 2.1.0 - string-width: 3.1.0 + has-flag: 4.0.0 - temp-fs@0.9.9: + supports-color@8.1.1: dependencies: - rimraf: 2.5.4 + has-flag: 4.0.0 - term-size@1.2.0: - dependencies: - execa: 0.7.0 + symbol-tree@3.2.4: {} text-table@0.2.0: {} - through@2.3.8: {} - - timed-out@4.0.1: {} - - tmp@0.0.33: - dependencies: - os-tmpdir: 1.0.2 - - tmp@0.2.1: - dependencies: - rimraf: 3.0.2 + tldts-core@6.1.86: {} - to-object-path@0.3.0: + tldts@6.1.86: dependencies: - kind-of: 3.2.2 + tldts-core: 6.1.86 - to-regex-range@2.1.1: - dependencies: - is-number: 3.0.0 - repeat-string: 1.6.1 + tmp@0.2.7: {} - to-regex@3.0.2: + to-regex-range@5.0.1: dependencies: - define-property: 2.0.2 - extend-shallow: 3.0.2 - regex-not: 1.0.2 - safe-regex: 1.1.0 + is-number: 7.0.0 touch@3.1.0: dependencies: nopt: 1.0.10 - tough-cookie@2.4.3: + tough-cookie@5.1.2: dependencies: - psl: 1.7.0 - punycode: 1.4.1 + tldts: 6.1.86 - tslib@1.10.0: {} - - tunnel-agent@0.6.0: + tr46@5.1.1: dependencies: - safe-buffer: 5.1.2 + punycode: 2.3.1 - tweetnacl@0.14.5: {} + tree-kill@1.2.2: {} - type-check@0.3.2: + type-check@0.4.0: dependencies: - prelude-ls: 1.1.2 + prelude-ls: 1.2.1 type-detect@4.0.8: {} - type-fest@0.8.1: {} + type-detect@4.1.0: {} + + type-fest@0.20.2: {} typescript@7.0.2: optionalDependencies: @@ -3529,137 +1992,51 @@ snapshots: dependencies: commander: 2.20.3 - undefsafe@2.0.3(supports-color@5.5.0): - dependencies: - debug: 2.6.9(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color + undefsafe@2.0.5: {} undici-types@7.18.2: {} - union-value@1.0.1: - dependencies: - arr-union: 3.1.0 - get-value: 2.0.6 - is-extendable: 0.1.1 - set-value: 2.0.1 - - unique-string@1.0.0: - dependencies: - crypto-random-string: 1.0.0 - - unset-value@1.0.0: - dependencies: - has-value: 0.3.1 - isobject: 3.0.1 - - unzip-response@2.0.1: {} - - upath@1.2.0: {} - - update-notifier@2.5.0: - dependencies: - boxen: 1.3.0 - chalk: 2.4.2 - configstore: 3.1.2 - import-lazy: 2.1.0 - is-ci: 1.2.1 - is-installed-globally: 0.1.0 - is-npm: 1.0.0 - latest-version: 3.1.0 - semver-diff: 2.1.0 - xdg-basedir: 3.0.0 - uri-js@4.2.2: dependencies: - punycode: 2.1.1 - - urix@0.1.0: {} - - url-parse-lax@1.0.0: - dependencies: - prepend-http: 1.0.4 - - use@3.1.1: {} + punycode: 2.3.1 util-deprecate@1.0.2: {} uuid-validate@0.0.3: {} - uuid@3.4.0: {} - - v8-compile-cache@2.1.0: {} - - verror@1.10.0: + w3c-xmlserializer@5.0.0: dependencies: - assert-plus: 1.0.0 - core-util-is: 1.0.2 - extsprintf: 1.3.0 + xml-name-validator: 5.0.0 - which-module@2.0.0: {} + webidl-conversions@7.0.0: {} - which@1.3.1: + whatwg-encoding@3.1.1: dependencies: - isexe: 2.0.0 + iconv-lite: 0.6.3 - wide-align@1.1.3: + whatwg-mimetype@4.0.0: {} + + whatwg-url@14.2.0: dependencies: - string-width: 2.1.1 + tr46: 5.1.1 + webidl-conversions: 7.0.0 - widest-line@2.0.1: + which@2.0.2: dependencies: - string-width: 2.1.1 + isexe: 2.0.0 - word-wrap@1.2.3: {} + word-wrap@1.2.5: {} wordwrap@1.0.0: {} - wrap-ansi@5.1.0: - dependencies: - ansi-styles: 3.2.1 - string-width: 3.1.0 - strip-ansi: 5.2.0 + workerpool@10.0.3: {} wrappy@1.0.2: {} - write-file-atomic@2.4.3: - dependencies: - graceful-fs: 4.2.1 - imurmurhash: 0.1.4 - signal-exit: 3.0.2 - - write@1.0.3: - dependencies: - mkdirp: 0.5.5 - - ws@8.8.1: {} - - xdg-basedir@3.0.0: {} - - y18n@4.0.0: {} + ws@8.21.3: {} - yallist@2.1.2: {} + xml-name-validator@5.0.0: {} - yargs-parser@13.1.2: - dependencies: - camelcase: 5.3.1 - decamelize: 1.2.0 - - yargs-unparser@1.6.0: - dependencies: - flat: 4.1.0 - lodash: 4.17.15 - yargs: 13.3.2 + xmlchars@2.2.0: {} - yargs@13.3.2: - dependencies: - cliui: 5.0.0 - find-up: 3.0.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - require-main-filename: 2.0.0 - set-blocking: 2.0.0 - string-width: 3.1.0 - which-module: 2.0.0 - y18n: 4.0.0 - yargs-parser: 13.1.2 + yocto-queue@0.1.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index adb667b..2f8fd97 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,12 +1,4 @@ -minimumReleaseAge: 10080 -minimumReleaseAgeStrict: true -minimumReleaseAgeIgnoreMissingTime: false -trustPolicy: no-downgrade -trustLockfile: false -blockExoticSubdeps: true -engineStrict: true -strictDepBuilds: true -verifyDepsBeforeRun: error -allowBuilds: - fsevents: false - nodemon: false +overrides: + minimist@<1.2.6: ^1.2.8 + minimatch@<3.1.4: ^3.1.4 + brace-expansion@<1.1.18: ^1.1.18 diff --git a/src/default.js b/src/default.js index d8dd4c9..b84b0df 100644 --- a/src/default.js +++ b/src/default.js @@ -149,6 +149,18 @@ if (logSettings) warn("Settings", overwriteOptions); + // A server-created initial pageview can be enriched by this script. + var pageLoadId = + overwriteOptions.pageLoadId || attr(scriptElement, "page-load-id"); + if ( + typeof pageLoadId !== "string" || + !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test( + pageLoadId + ) + ) { + pageLoadId = undefinedVar; + } + /** if ignoremetrics **/ // Customers can skip data points var ignoreMetrics = convertCommaSeparatedToArray( @@ -538,10 +550,13 @@ https: loc.protocol == https, timezone: timezone, - page_id: collectDataOnLeave ? uuid() : undefinedVar, + collected_client_side: trueVar, + page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar), // se = sessions - session_id: collectMetricByString("se") ? uuid() : undefinedVar, + session_id: collectMetricByString("se") + ? pageLoadId || uuid() + : undefinedVar, }); /** if sri **/ @@ -777,7 +792,9 @@ callback ) { if (isPushState) sendOnLeave("" + payload.page_id, trueVar); - if (collectDataOnLeave) payload.page_id = uuid(); + var originalId = pages === 0 ? pageLoadId : undefinedVar; + payload.page_id = + originalId || (collectDataOnLeave ? uuid() : undefinedVar); var currentPage = definedHostname + getPath(); var query = getQueryParams(deleteSourceInfo, search); @@ -785,7 +802,8 @@ sendData( { id: payload.page_id, - type: pageviewText, + original_id: originalId, + type: originalId ? "append" : pageviewText, referrer: !deleteSourceInfo || sameSite ? referrer : null, query: query, /** if ignoremetrics **/ diff --git a/test/helpers/get-browsers.js b/test/helpers/get-browsers.js index 2b24254..d7549f9 100644 --- a/test/helpers/get-browsers.js +++ b/test/helpers/get-browsers.js @@ -1,5 +1,3 @@ -const request = require("request"); - const { selectBrowsers } = require("./browser-matrix"); const { BROWSERSTACK_USERNAME, @@ -81,22 +79,21 @@ const withRetries = async ( ); }; -const requestJson = (options) => - new Promise((resolve, reject) => { - request( - { method: "GET", json: true, timeout: REQUEST_TIMEOUT, ...options }, - (error, response, body) => { - if (error) return reject(error); - if ( - !response || - response.statusCode < 200 || - response.statusCode >= 300 - ) - return reject(new Error(`HTTP ${response?.statusCode || "unknown"}`)); - return resolve(body); +const requestJson = async ({ url, auth }) => { + const headers = auth + ? { + Authorization: + "Basic " + + Buffer.from(`${auth.user}:${auth.pass}`).toString("base64"), } - ); + : undefined; + const response = await fetch(url, { + headers, + signal: AbortSignal.timeout(REQUEST_TIMEOUT), }); + if (!response.ok) throw new Error(`HTTP ${response.status}`); + return response.json(); +}; const requireArray = (source, value) => { if (!Array.isArray(value) || !value.length) diff --git a/test/unit/page-load-id.test.js b/test/unit/page-load-id.test.js new file mode 100644 index 0000000..80c3ea9 --- /dev/null +++ b/test/unit/page-load-id.test.js @@ -0,0 +1,109 @@ +const { expect } = require("chai"); +const { runInContext } = require("vm"); +const { createDOM } = require("./helpers/dom"); + +const pageLoadId = "2c304ecc-1e0a-4fa6-86a8-1ba4684db774"; +const attributeId = "e35432dd-4af3-40c3-90ad-5a95d8e4fb1f"; +const requests = (dom) => + dom.sent + .filter(({ type }) => type === "image") + .map(({ url }) => new URL(url).searchParams); +const wait = () => new Promise((resolve) => setTimeout(resolve, 20)); + +describe("server page-load ID", function () { + it("links events emitted before a manual first pageview to the server record", async function () { + const dom = createDOM({ settings: { pageLoadId, autoCollect: false } }); + dom.window.sa_event("early_event"); + await wait(); + const event = requests(dom).find( + (params) => params.get("type") === "event" + ); + expect(event.get("page_id")).to.equal(pageLoadId); + expect(event.get("session_id")).to.equal(pageLoadId); + dom.window.close(); + }); + + it("enriches the initial record and creates new records for later pageviews", async function () { + const dom = createDOM({ settings: { pageLoadId, autoCollect: false } }); + dom.window.sa_pageview("/first"); + await wait(); + dom.window.sa_event("signup"); + dom.window.sa_pageview("/second"); + await wait(); + + const initial = requests(dom).find( + (params) => + params.get("path") === "/first" && params.get("type") === "append" + ); + expect(initial.get("original_id")).to.equal(pageLoadId); + expect(initial.get("session_id")).to.equal(pageLoadId); + expect(initial.get("collected_client_side")).to.equal("true"); + const event = requests(dom).find( + (params) => params.get("type") === "event" + ); + expect(event.get("page_id")).to.equal(pageLoadId); + expect(event.get("id")).not.to.equal(pageLoadId); + const second = requests(dom).find( + (params) => params.get("type") === "pageview" + ); + expect(second.get("path")).to.equal("/second"); + expect(second.get("id")).not.to.equal(pageLoadId); + expect(second.get("session_id")).to.equal(pageLoadId); + expect(second.has("original_id")).to.equal(false); + dom.window.close(); + }); + + for (const settings of [{}, { pageLoadId }]) { + it(`reads the attribute with ${settings.pageLoadId ? "JavaScript precedence" : "no JavaScript setting"}`, async function () { + const dom = createDOM({ + settings, + beforeRun(context) { + runInContext( + `Object.defineProperty(document, "currentScript", { value: { getAttribute: function(name) { return name === "data-page-load-id" ? "${attributeId}" : null; } } });`, + context + ); + }, + }); + await wait(); + expect(requests(dom)[0].get("original_id")).to.equal( + settings.pageLoadId || attributeId + ); + dom.window.close(); + }); + } + + for (const invalidId of [ + undefined, + "not-a-uuid", + "e35432dd-4af3-70c3-90ad-5a95d8e4fb1f", + ]) { + it(`keeps normal collection for ${invalidId || "an absent ID"}`, async function () { + const dom = createDOM({ settings: { pageLoadId: invalidId } }); + await wait(); + const initial = requests(dom)[0]; + expect(initial.get("type")).to.equal("pageview"); + expect(initial.has("original_id")).to.equal(false); + dom.window.close(); + }); + } + + it("merges when duration and scroll are disabled, without reusing the record on navigation", async function () { + const dom = createDOM({ + settings: { + pageLoadId, + autoCollect: false, + ignoreMetrics: "timeonpage,scrolled,sessions", + }, + }); + dom.window.sa_pageview("/first"); + await wait(); + dom.window.sa_pageview("/next"); + await wait(); + const [initial, next] = requests(dom); + expect(initial.get("original_id")).to.equal(pageLoadId); + expect(initial.has("session_id")).to.equal(false); + expect(next.get("type")).to.equal("pageview"); + expect(next.get("id")).not.to.equal(pageLoadId); + dom.window.close(); + }); +}); From 62d75910079e9b999f2d1100a32b5e5ff394df34 Mon Sep 17 00:00:00 2001 From: Simple Analytics Codex Date: Sun, 27 Sep 2026 21:23:44 +0300 Subject: [PATCH 2/9] Preserve BrowserStack capability compatibility --- package.json | 2 +- pnpm-lock.yaml | 18 ++++++------------ 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 7941b9d..976f799 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "jsdom": "^26.1.0", "mocha": "^12.0.2", "nodemon": "^3.1.14", - "selenium-webdriver": "^4.49.0", + "selenium-webdriver": "4.3.1", "typescript": "7.0.2", "uglify-js": "^3.9.4", "uuid-validate": "0.0.3" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3122f48..7099145 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -51,8 +51,8 @@ importers: specifier: ^3.1.14 version: 3.1.14 selenium-webdriver: - specifier: ^4.49.0 - version: 4.49.0 + specifier: 4.3.1 + version: 4.3.1 typescript: specifier: 7.0.2 version: 7.0.2 @@ -68,9 +68,6 @@ packages: '@asamuzakjp/css-color@3.2.0': resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} - '@bazel/runfiles@6.5.0': - resolution: {integrity: sha512-RzahvqTkfpY2jsDxo8YItPX+/iZ6hbiikw1YhE0bA9EKBR5Og8Pa6FHn9PO9M0zaXRVsr0GFQLKbB/0rzy9SzA==} - '@clack/core@1.4.3': resolution: {integrity: sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ==} engines: {node: '>= 20.12.0'} @@ -875,9 +872,9 @@ packages: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} - selenium-webdriver@4.49.0: - resolution: {integrity: sha512-16XqeOEMj+4+p+pzLLyvNWmF5jCY05EKIl3e1anZBgv4+zq7PUTtiNjKtQhMpwosZ0wIMKDFAQ2xdyogOHD4DA==} - engines: {node: '>= 22.0.0'} + selenium-webdriver@4.3.1: + resolution: {integrity: sha512-TjH/ls1WKRQoFEHcqtn6UtwcLnA3yvx08v9cSSFYvyhp8hJWRtbe9ae2I8uXPisEZ2EaGKKoxBZ4EHv0BJM15g==} + engines: {node: '>= 10.15.0'} semver@7.8.5: resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} @@ -1087,8 +1084,6 @@ snapshots: '@csstools/css-tokenizer': 3.0.4 lru-cache: 10.4.3 - '@bazel/runfiles@6.5.0': {} - '@clack/core@1.4.3': dependencies: fast-wrap-ansi: 0.2.2 @@ -1871,9 +1866,8 @@ snapshots: dependencies: xmlchars: 2.2.0 - selenium-webdriver@4.49.0: + selenium-webdriver@4.3.1: dependencies: - '@bazel/runfiles': 6.5.0 jszip: 3.10.2 tmp: 0.2.7 ws: 8.21.3 From 9b3b7807c43d5abe412c1aa05d3da758e47bfda3 Mon Sep 17 00:00:00 2001 From: Simple Analytics Codex Date: Sun, 27 Sep 2026 21:26:07 +0300 Subject: [PATCH 3/9] Discard page-load merge IDs for ignored initial paths --- dist/latest/cloudflare.js | 3 ++- dist/latest/custom/app.js | 4 ++-- dist/latest/custom/app.js.map | 2 +- dist/latest/custom/e.js | 4 ++-- dist/latest/custom/e.js.map | 2 +- dist/latest/custom/latest.dev.js | 3 ++- dist/latest/custom/latest.js | 4 ++-- dist/latest/custom/latest.js.map | 2 +- dist/latest/custom/proxy.js | 4 ++-- dist/latest/custom/proxy.js.map | 2 +- dist/latest/hello.js | 4 ++-- dist/latest/hello.js.map | 2 +- dist/latest/latest.dev.js | 3 ++- dist/latest/latest.js | 4 ++-- dist/latest/latest.js.map | 2 +- dist/v12/app.js | 4 ++-- dist/v12/app.js.map | 2 +- dist/v12/custom/app.js | 4 ++-- dist/v12/custom/app.js.map | 2 +- dist/v12/custom/proxy.js | 4 ++-- dist/v12/custom/proxy.js.map | 2 +- pnpm-workspace.yaml | 12 ++++++++++++ src/default.js | 1 + test/unit/page-load-id.test.js | 17 +++++++++++++++++ 24 files changed, 63 insertions(+), 30 deletions(-) diff --git a/dist/latest/cloudflare.js b/dist/latest/cloudflare.js index 1f0175d..8019739 100644 --- a/dist/latest/cloudflare.js +++ b/dist/latest/cloudflare.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 170e; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; d163; v12) */ /* eslint-env browser */ (function ( @@ -673,6 +673,7 @@ // Ignore pages specified in data-ignore-pages if (shouldIgnore(path)) { + pageLoadId = undefinedVar; warn(notSendingWhen + "ignoring " + path); return; } diff --git a/dist/latest/custom/app.js b/dist/latest/custom/app.js index 196d480..753213e 100644 --- a/dist/latest/custom/app.js +++ b/dist/latest/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; a6bf; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; b438; v12) */ -!function(h,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); +!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/latest/custom/app.js.map b/dist/latest/custom/app.js.map index 0cdc760..b263293 100644 --- a/dist/latest/custom/app.js.map +++ b/dist/latest/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n pageLoadId = undefinedVar;\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/e.js b/dist/latest/custom/e.js index e003bd6..7061fa0 100644 --- a/dist/latest/custom/e.js +++ b/dist/latest/custom/e.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; df2d; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 6e19; v12) */ -!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,f=w.userAgent,p="Not sending request ",d=p+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,ft=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); +!function(h,t,e,n,v){try{var m=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){v("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&v(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); //# sourceMappingURL=e.js.map \ No newline at end of file diff --git a/dist/latest/custom/e.js.map b/dist/latest/custom/e.js.map index 96896da..cd3ef1a 100644 --- a/dist/latest/custom/e.js.map +++ b/dist/latest/custom/e.js.map @@ -1 +1 @@ -{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n pageLoadId = undefinedVar;\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/latest.dev.js b/dist/latest/custom/latest.dev.js index c4296cd..223463f 100644 --- a/dist/latest/custom/latest.dev.js +++ b/dist/latest/custom/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 2aa6; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 8c8f; v12) */ /* eslint-env browser */ (function ( @@ -673,6 +673,7 @@ // Ignore pages specified in data-ignore-pages if (shouldIgnore(path)) { + pageLoadId = undefinedVar; warn(notSendingWhen + "ignoring " + path); return; } diff --git a/dist/latest/custom/latest.js b/dist/latest/custom/latest.js index 7c13732..c69e911 100644 --- a/dist/latest/custom/latest.js +++ b/dist/latest/custom/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; d8a8; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; cd74; v12) */ -!function(h,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,f=w.userAgent,p="Not sending request ",d=p+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,ft=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); +!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); //# sourceMappingURL=latest.js.map \ No newline at end of file diff --git a/dist/latest/custom/latest.js.map b/dist/latest/custom/latest.js.map index 706be44..7d417f9 100644 --- a/dist/latest/custom/latest.js.map +++ b/dist/latest/custom/latest.js.map @@ -1 +1 @@ -{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n pageLoadId = undefinedVar;\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAhBW3B,WAgB4BR,EACvCoC,EAAkBf,EAAIe,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAASzB,EAAI0B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK5B,KAAe,WAAW4B,KAAK5B,GACxD6B,EAAStD,EAAOsD,OAIhBC,EACFhC,EAAIiC,eAAiBjC,EAAIkC,cAAc,gBAAkBvD,EAAU,MAOrEE,EAAO,WAEL,IAAIsD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK9C,EAAIV,KAAMU,EAAK4C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnChE,EAAK,iBAAmB+D,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWjG,EAAOkG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKnG,GAAkBqF,OAG5DrF,EAAmB0F,EAAO1F,EAAkBgG,GAExCE,GAAa/F,EAAK,WAAYH,GAGlC,IAAIoG,GACFpG,EAAiBoG,YAActB,EAAKxB,EAAe,gBAE7B,iBAAf8C,IACN,yEAAyEhD,KACxEgD,MAGFA,GAAahG,GAIf,IA+EIiG,GA/EAC,GAAgBrB,EAClBjF,EAAiBsG,eAAiBxB,EAAKxB,EAAe,mBAGpDiD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU7B,GAC7B,OAAO,IAAI8B,OAAO,IAAMF,GAAoBpD,KAAKwB,KAChDS,QAIHsB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe/G,EAAOgH,QAAUhH,EAAOiH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOnD,GACP,OAAO8C,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF7H,EAAiB4H,KACjB9C,EAAKxB,EAAesE,KAwyBxB,KAryBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBlI,EAAO8H,GAAY,aACpCtC,EAAS0C,KAAiBF,EAAWrC,EAAOqC,EAAUE,IAC1D,IAAIC,EAA4BnI,EAAOoI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACFhI,EACEgI,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOrC,EACLqC,EACAG,EAA0BvE,KAAK5D,EAAQ2F,EAAOqC,EAAUC,KAE1D,MAAO7D,GACPF,EAAe,WAAYE,KAU3BiE,GACFpI,EAAiBoI,WACjBtD,EAAKxB,EAAe,eAAiB9C,EAInC6H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAKhG,EACvD,IAAIiI,GAAKD,GAAmBrH,EAAIuH,QAC7B/E,MAAM,GACN4B,MAAM,KACNmB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM9F,GAAgB,EAAJoI,GAASD,EAAShF,MAAMiF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAShF,MAAM,EAAGiF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIrE,GAAasE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAY1D,OAAe9E,EAInC,IAAImG,OAAOwC,EAAO,KAAK9F,KAAKsF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKjG,EACFoI,GAAKpI,GA+BV+I,GAAiBtB,GAAY,UACjC,GAAI9H,EAAOoJ,KAAmB7I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOqJ,gBAAkB9I,EACzBP,EAAOoJ,IAAkB7I,EAOzB,IAAI+I,GAAW,SAAUrB,EAAMsB,EAAUC,GACvCvB,EAAOuB,EAAevB,EAAOtC,EAAO8D,GAASC,GAAMzB,GAE/ChH,EAAI0I,QAAUH,IAAcvB,EAAK0B,MAAQpJ,GACzCU,EAAI2I,qBAAuBJ,IAAcvB,EAAK4B,KAAOtJ,GAGzD,IAAIuJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJ7H,EACA,eACAmC,OAAO4B,KAAK6B,GACTvB,OAAO,SAAUyD,GAChB,OAAOlC,EAAKkC,IAAQ9J,IAErB4I,IAAI,SAAUkB,GACb,OACEtI,EAAuBsI,GACvB,IACAtI,EAAuBoG,EAAKkC,MAG/BjB,KAAK,KACR,SACArC,KAAKD,OAILwD,GACFnK,EAAiBoK,UAAYtF,EAAKxB,EAAe,YAC/C+G,GAAkBF,IAAuB/I,EAEzCkJ,GAAc,CAChBC,QAspBJ,mBArpBIH,SAAUC,IASZnK,EAAY,SAAUsK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJrK,EAAKqK,GACLnB,GACE3D,EAAO4E,GAAa,CAClBI,KAAM9J,EACNuD,MAAOqG,EACPG,KAAMzJ,EAAI0J,WAEZxK,EACAE,IAMJ4B,EACEtB,EACA,SAAUiK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASlC,QAAQ3I,IAC3CC,EAAU2K,EAAME,UAGpBxK,GAOF,IAwDIyK,GAxDAC,GAAQtE,KAERuE,GAAW,EAOXC,GAAOnL,EAAiBmL,MAAQrG,EAAKxB,EAAe,QAGpD8H,MA/KsBC,GA+KCrL,EAAiBoL,cA9KvBC,GA+KjBrL,EAAiBoL,WACjBtG,EAAKxB,EAAe,eAAiB9C,GACrCsE,EAAKxB,EAAe,aAAe9C,GACnCsE,EAAKxB,EAAe,gBAAkB9C,EAGtC8K,KACqC,SAAvCxG,EAAKxB,EAAe,iBACpBtD,EAAiBsL,cAAgB/K,GAI/BgL,GACFvL,EAAiBwL,UACjB1G,EAAKxB,EAAe,cACpBuE,GAAY,IAAMlH,EAGhB8K,GAAcxG,EAChBjF,EAAiByL,aAAe3G,EAAKxB,EAAe,iBAIlDyF,GAAc9D,EAChBjF,EAAiB+I,aAAejE,EAAKxB,EAAe,iBAIlDoI,GAAqBzG,EACvBjF,EAAiB0L,oBACf5G,EAAKxB,EAAe,yBAIpBqI,GACF3L,EAAiB2L,gBAAkB7G,EAAKxB,EAAe,mBAGrD6E,GACFnI,EAAiBmI,mBACjBrD,EAAKxB,EAAe,sBAItB,IAEE0H,GAAWzE,GAAsB,KAC7BqF,KAAKC,iBAAiBC,kBAAkBC,SACxC3L,EACJ,MAAO+D,IACPhE,EAAKgE,IAOP,IAAI6H,GAAUjM,EAAOiM,QACjBC,GACFjL,EAAIkL,WACJnM,EAAOoM,aACPpM,EAAOqM,aACPrM,EAAOsM,UACNL,KAAYA,GAAQM,QACrBvM,EAAOwM,YACPxM,EAAOyM,MACPrJ,GACAqE,KAAKC,UAAYD,KAAKC,SAGpBgF,GACFlG,GAAsB,MAAQA,GAAsB,QAElD0F,KAAK3B,GAAY2B,IAAM3L,GAE3B,IAAIkJ,GAAU9D,EAAO4E,GAAa,CAEhCoC,GAAInG,GAAsB,MAAQ/E,EAAYpB,EAE9CK,MAAOS,EAAIyL,UAAYlM,EACvBuK,SAAUA,GACV4B,sBAAuBtM,EACvBuM,QAASzG,KAAeqG,GAAqB5F,KAASzG,GAGtD0M,WAAYvG,GAAsB,MAC9BH,IAAcS,KACdzG,IA0BN,GAvBAoJ,GAAQuD,IAAMxM,EAIVkC,IACF+G,GAAQwD,OAASvK,EAAOuK,OACxBxD,GAAQyD,OAASjL,EAAUS,EAAOwK,SAS/B3L,EAAI4L,SAAS/M,EAAK,4CAInBkK,KAAoBjJ,IACtBoI,GAAQ2D,kBAAoB/L,IAGzBgK,IAAcrK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBkC,EAAU,SAK7B,GAAlC7B,EAAiBwH,QAAQ,OACxB,aAAaxF,KAAKhC,IACnB+I,IAEDhK,EACE,mBACEiB,EACA,SACA6B,EACA,0BAON,IACImK,GA0DAC,GA3DA5D,GAAO,GAGP6D,GAAc,WAKhB,OAFEtN,EAAiBuN,UAAYzI,EAAKxB,EAAe,aAGzBhC,EAAIiM,UAAY,IACrC1I,QAAQzD,EAAkBiJ,IAC1BxF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAASzE,GAKjCmN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKlB,GAAL,CAEA,IAAImB,EAASlI,EAAO4E,GAAa,CAC/BI,KAAM,SACNmD,YAAaF,EAAOD,EAAKlE,GAAQqD,UAenC,GAXItG,GAAsB,OACxBqH,EAAOE,SAAWtG,KAAKuG,OAAOpH,KAAQsE,GAAQuC,IAlhBnC,MAohBbA,GAAW,EACXvC,GAAQtE,KAGJJ,GAAsB,UACxBqH,EAAO1C,SAAW1D,KAAKwG,IAAI,EAAG9C,GAAU+C,OAGtCN,IAAS3M,EAAIkN,WAEf7E,GAASuE,EAAQxN,EAAcE,QAE/B,IACEU,EAAIkN,WAAWC,KAAKnN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU4L,IAC3D,MAAOQ,GAEP/E,GAASuE,EAAQxN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAI+M,QACA,KAAOvL,KAAY/C,GAAS0N,KAClCJ,GAAc1G,MACT6G,IAAY7G,KAAQ0G,IAE7B9M,GAGF2B,EAAqBY,EAAU2K,GAAalN,GAE5C,IAAI+N,GAAOhN,EAAIgN,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuBlM,EAAgBQ,IAAiB,EACxD2L,EAAShH,KAAKwG,IAChBM,GAAK3L,IAAiB,EACtB2L,GAAK1L,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO4E,KAAKiH,IACV,IAKI,EAJJjH,KAAKuG,MACF,MAAQ1L,EAAgBqM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOrK,IAEP,OADAhE,EAAKgE,IACE,IAIXjC,EAAqB,OAAQ,WAC3BgJ,GAAW+C,KACX/L,EACEM,EACA,WACM0I,GAAW+C,OAAY/C,GAAW+C,OAExC1N,KAQJ,IAiCIoO,GAuCAC,GAAUC,GAxEVC,GAAU,SAAUC,GACtB,IAAIpE,EAAO,GAIX,IACEA,EAAOoE,GAAajN,EAAuBZ,EAAI0J,UAC/C,MAAOzG,IACPhE,EAAKgE,IAGP,IAAI6K,EAAyBjP,EAAO4L,IACpC,GAAIjE,GAAWsH,GACb,IACErE,EAAOqE,EAAuBrL,KAAK5D,EAAQ,CAAE4K,KAAMA,KAAWA,EAC9D,MAAOxG,IACPF,EAAe,OAAQE,IAK3B,OA/YiB,SAAUwG,GAC3B,IAAK,IAAIhC,KAAK8C,GAAa,CACzB,IAAIwD,EAAgBxD,GAAY9C,GAChC,GAAKsG,EAAL,CAGA,IAAIC,EA1PI,KA2PND,EAAc,GAAcA,EA3PtB,IA2P8CA,EAEtD,GACEC,IAAevE,GACf,IAAIjE,OACF,IAAM/B,EAAYuK,GAAYrK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKuH,GAEP,OAAOrK,GAEX,OAAOC,EA6XH4O,CAAaxE,IACfvE,GAAahG,OACbD,EAAKuB,EAAiB,YAAciJ,KAK1B,QAARQ,IAAkBjK,EAAIkO,OAAMzE,GAAQzJ,EAAIkO,KAAK9J,MAAM,KAAK,IAErDqF,IA4CL0E,GAAW,SACbC,EACAC,EACAxH,EACAyH,IAEKA,GAAe9H,GAAWK,KAAWyH,EAAczH,GACxD,IACI0H,EAGEC,EAJFpG,EAAW5B,GAAW8H,GAAeA,EAAc,aAEnD/K,EAAS8K,KAAgD,EAA9BA,EAAc3G,QAAQ,OAGnD2G,GADIG,EAAQH,EAAcjK,MAAM,MACVqK,QACtBF,EAAc,IAAMC,EAAMzG,KAAK,MAGjC,IAAI0B,EAAOmE,GAAQS,GAGnB,GAAK5E,GAAQyC,IAAgBzC,EAA7B,CAEAyC,GAAezC,EACflB,GAAKkB,KAAOA,EAGRpE,GAAsB,OACxBkD,GAAKmG,eACHpI,KAAKwG,IAAI3L,EAA2B,aAAK,EAAGtC,EAAO8P,YAAc,IACjE,KACFpG,GAAKqG,gBACHtI,KAAKwG,IACH3L,EAAgBQ,IAAiB,EACjC9C,EAAOgQ,aAAe,IACnB,MAILxJ,GAAsB,MACpBvF,EAAIsB,KAAWmH,GAAKnH,GAAYtB,EAAIsB,IAItCe,GAAUkD,GAAsB,QAClCkD,GAAKuG,aAAe3M,EAAO4M,MAC3BxG,GAAKyG,cAAgB7M,EAAOmL,QAI9B,IAII2B,EAJAC,EAAOrQ,EAAOsQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG5F,KAC/D,MAAOvG,IACPhE,EAAKgE,IAGP0K,GAAgBsB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBvH,QAAQuH,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAG1H,QAAQwH,EAAKE,GAAgB5F,MAGxC,IAAI8F,EAA0BjD,GAC1BA,GAASjI,MA7vBH,KA6vBgB,GACtBlF,EACJwO,GAAWrB,IACgD,EAAvD7B,GAAmB9C,QAAQ4H,IAC3BA,GAA2BpP,EAC3Bb,EAGJkJ,GAAKgH,OACH,QAAQrN,KAAKkK,OAAkBgC,GAAeT,GAC1CtO,GACCqO,GAEP7G,EAAWD,GAAeC,EAAU,CAClC2C,KAAMhK,EACNiK,KAAMlB,GAAKkB,OAGb,IAAI+F,EAAsB,WACxB/O,EAA2BrB,EAC3B,IAAIqQ,EACFrB,GAAeT,KAAkBtI,GAAsB,MAhI1C,SACjB+I,EACAsB,EACAhC,EACAnG,EACAV,EACAuB,GAEIgG,GAAa7B,GAAY,GAAKjE,GAAQqD,QAASvM,GACnD,IAAIuQ,EAAuB,IAAV3N,EAAckD,GAAahG,EAC5CoJ,GAAQqD,QACNgE,IAAepE,GAAqB5F,KAASzG,GAE/C,IAAI0Q,EAAczG,GAAkByE,KAChCiC,EAAQ1I,GAAeuI,EAAkBnI,GAE7CY,GACE,CACEqE,GAAIlE,GAAQqD,QACZgB,YAAagD,EACbnG,KAAMmG,EAAa,SAAWnQ,EAC9B6M,UAAWqD,GAAoBhC,EAAWrB,GAAW,KACrDwD,MAAOA,EACP1K,EAAGA,GAEH0B,SAAU/F,EAAU+F,IAEtBuB,GAGFqF,GAAmBpB,GACnBA,GAAWuD,EAEX5N,IAgGE8N,CACE1B,EACAqB,EACA/B,GACAa,EACA1H,EACAuB,IAIJ,GAAK3H,EAmBH+O,SAjBA,IACMjO,GAAUiF,GAAWjF,EAAOwO,sBAC9BxO,EACGwO,qBAAqB,CAAClO,EAAcC,IACpCkO,KAAK,SAAUC,GACd3H,GAAQ4H,QAAUD,EAAkBpO,GACpCyG,GAAQ6H,WAAaF,EAAkBnO,GACvC0N,MAEDY,SAAMZ,GAETA,IAEF,MAAOtC,GACPsC,OAWFa,GAAMxR,EAAOyR,QACbC,GAAeF,GAAMA,GAAIG,UAAYtR,EACrCuR,GAAM5R,EAAO6R,cACbC,GAAgB,YAIhBvG,IAAemG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB7G,GAoBAmH,IAlBrB,WACL,IAEIhH,EAFAjF,EAAMhC,UACNoO,EAAKD,GAAK/N,MAAMiO,KAAMrM,GAY1B,OAVI8B,GAAWoK,OACbjH,EAAQ,IAAIiH,MAAMpH,KAIlBG,EAAQvJ,EAAI4Q,YAAY,UAClBC,UAAUzH,GAAMpK,EAASA,GAEjCuK,EAAMjH,UAAYgC,EAClB+L,GAAI9G,GACGmH,IAMX9P,EACE2P,GACA,WACExC,GAAS,IAEX9O,GAGF2B,EACE,WACA,WACEmN,GAAS,IAEX9O,IAKA+K,IAAuB,QAARH,IAAkB,iBAAkBpL,GACrDmC,EACE,aACA,WACEmN,GAAS,IAEX9O,GAIA+K,IAAa+D,KAEjBtP,EAAOqS,YAAc,SAAUzH,EAAM5C,EAAUuB,GAC7C+F,GAAS,EAAG1E,EAAM5C,EAAUuB,IAQ9B,IAAI+I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUzH,EAAO9C,EAAUyH,IACpCA,GAAe9H,GAAWK,KAAWyH,EAAczH,GAExD,IAAIwK,EAAkB7K,GAAWmD,GAC7BvB,EAAW5B,GAAW8H,GAAeA,EAAc,aACnDgD,SAAmB3H,EAEvB,GAAIwH,GAAWzJ,QAAQ4J,GAAa,IAAMD,EAExC,OADAtO,EAAesH,GAAmB5K,EAAY,aAAe6R,GACtDlJ,IAGT,IACE,GAAIiJ,EAAiB,CACnB,IAAIE,EAAc5H,IAClB,GAAIwH,GAAWzJ,eAAe6J,GAAe,EAK3C,OAJAxO,EACEsH,GACAV,EAAQ,uBAAyB4H,GAE5BnJ,IAETuB,EAAQ4H,GAEV,MAAOtO,IAEP,OADAF,EAAesH,GAAmBpH,IAC3BmF,IAGTuB,GAAS,GAAKA,GAAOhG,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAI6N,EAAc,CAAEhI,KAAM/J,EAAWkK,MAAOA,GACxC8H,GAAa9D,IAAiB3L,EAAQ,EAE1C6E,EAAWD,GAAeC,EAAU2K,GAEhC7H,GACFxB,GACE3D,EAAOgN,EAAa,CAClBhF,GAAI7G,KACJkK,MAAO1I,IAAgBsK,GACvBpF,UACGoF,GAAa/D,KAAarI,GAAsB,KAC7CoI,GACA,KAEN5G,SAAU/F,EAAU+F,KAEtBuB,IAKFsJ,GAAmB,SAAU/H,EAAO9C,EAAUuB,GAChDgJ,GAAUzH,EAAO9C,EAAUuB,IAIxBvJ,EAAOwL,MACVxL,EAAOwL,IAAqBqH,IAE9B,IAAIC,GAAY9S,EAAOwL,IAGnBuH,GAAQD,IAAaA,GAAUrK,EAAIqK,GAAUrK,EAAI,GAMrD,IAAK,IAAIqC,MAHT9K,EAAOwL,IAAqBqH,GAGVE,GACZ1O,EAAQ0O,GAAOjI,MACjB1F,MAAMC,QAAQ0N,GAAMjI,KAChByH,GAAUtO,MAAM,KAAM8O,GAAMjI,KAC5ByH,GAAUQ,GAAMjI,MAGxB,MAAOuD,IACPlO,EAAUkO,IA7IY,IAAU1D,GACxBqH,GA5nBkB1G,GA/N9B,CA0+BEtL,OACA,uBACA"} \ No newline at end of file diff --git a/dist/latest/custom/proxy.js b/dist/latest/custom/proxy.js index 1ae250f..4cc13ef 100644 --- a/dist/latest/custom/proxy.js +++ b/dist/latest/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; ef42; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; a38f; v12) */ -!function(h,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",I="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); +!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",I="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/latest/custom/proxy.js.map b/dist/latest/custom/proxy.js.map index e909212..4f56cbf 100644 --- a/dist/latest/custom/proxy.js.map +++ b/dist/latest/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n pageLoadId = undefinedVar;\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/hello.js b/dist/latest/hello.js index 86bda97..13d8b8b 100644 --- a/dist/latest/hello.js +++ b/dist/latest/hello.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 95aa) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; b860) */ -!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,q="https://queue."+e,M=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[Mt];if(!ot(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[Mt];if(!ot(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"hello.source.js","sources":["hello.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n pageLoadId = undefinedVar;\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/latest.dev.js b/dist/latest/latest.dev.js index 47e2469..39fba00 100644 --- a/dist/latest/latest.dev.js +++ b/dist/latest/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; ea66; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 0c7f; v12) */ /* eslint-env browser */ (function ( @@ -673,6 +673,7 @@ // Ignore pages specified in data-ignore-pages if (shouldIgnore(path)) { + pageLoadId = undefinedVar; warn(notSendingWhen + "ignoring " + path); return; } diff --git a/dist/latest/latest.js b/dist/latest/latest.js index ada1e7d..d9aa971 100644 --- a/dist/latest/latest.js +++ b/dist/latest/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 4172; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 389a; v12) */ -!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,q="https://queue."+e,M=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[Mt];if(!ot(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[Mt];if(!ot(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n pageLoadId = undefinedVar;\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/app.js b/dist/v12/app.js index 9eaa082..bbbcc3e 100644 --- a/dist/v12/app.js +++ b/dist/v12/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; f9a6; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 4e37; SRI-version; v12) */ -!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,q="https://queue."+e,M=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[Mt];if(!ot(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[Mt];if(!ot(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAAaC,iBAA0BpC,EACvCqC,EAAkBhB,EAAIgB,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAAS1B,EAAI2B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK7B,KAAe,WAAW6B,KAAK7B,GACxD8B,EAASvD,EAAOuD,OAIhBC,EACFjC,EAAIkC,eAAiBlC,EAAImC,cAAc,gBAAkBxD,EAAU,MAOrEE,EAAO,WAEL,IAAIuD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK/C,EAAIV,KAAMU,EAAK6C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnCjE,EAAK,iBAAmBgE,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWlG,EAAOmG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKpG,GAAkBsF,OAG5DtF,EAAmB2F,EAAO3F,EAAkBiG,GAExCE,GAAahG,EAAK,WAAYH,GAGlC,IAAIqG,GACFrG,EAAiBqG,YAActB,EAAKxB,EAAe,gBAE7B,iBAAf8C,IACN,yEAAyEhD,KACxEgD,MAGFA,GAAajG,GAIf,IA+EIkG,GA/EAC,GAAgBrB,EAClBlF,EAAiBuG,eAAiBxB,EAAKxB,EAAe,mBAGpDiD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU7B,GAC7B,OAAO,IAAI8B,OAAO,IAAMF,GAAoBpD,KAAKwB,KAChDS,QAIHsB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAehH,EAAOiH,QAAUjH,EAAOkH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOnD,GACP,OAAO8C,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF9H,EAAiB6H,KACjB9C,EAAKxB,EAAesE,KAuyBxB,KApyBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBnI,EAAO+H,GAAY,aACpCtC,EAAS0C,KAAiBF,EAAWrC,EAAOqC,EAAUE,IAC1D,IAAIC,EAA4BpI,EAAOqI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACFjI,EACEiI,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOrC,EACLqC,EACAG,EAA0BvE,KAAK7D,EAAQ4F,EAAOqC,EAAUC,KAE1D,MAAO7D,GACPF,EAAe,WAAYE,KAU3BiE,GACFrI,EAAiBqI,WACjBtD,EAAKxB,EAAe,eAAiB/C,EAInC8H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAKjG,EACvD,IAAIkI,GAAKD,GAAmBtH,EAAIwH,QAC7B/E,MAAM,GACN4B,MAAM,KACNmB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM/F,GAAgB,EAAJqI,GAASD,EAAShF,MAAMiF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAShF,MAAM,EAAGiF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIrE,GAAasE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAY1D,OAAe/E,EAInC,IAAIoG,OAAOwC,EAAO,KAAK9F,KAAKsF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKlG,EACFqI,GAAKrI,GA+BVgJ,GAAiBtB,GAAY,UACjC,GAAI/H,EAAOqJ,KAAmB9I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOsJ,gBAAkB/I,EACzBP,EAAOqJ,IAAkB9I,EAOzB,IAAIgJ,GAAW,SAAUrB,EAAMsB,EAAUC,GACvCvB,EAAOuB,EAAevB,EAAOtC,EAAO8D,GAASC,GAAMzB,GAE/CjH,EAAI2I,QAAUH,IAAcvB,EAAK0B,MAAQrJ,GACzCU,EAAI4I,qBAAuBJ,IAAcvB,EAAK4B,KAAOvJ,GAGzD,IAAIwJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJ9H,EACA,eACAoC,OAAO4B,KAAK6B,GACTvB,OAAO,SAAUyD,GAChB,OAAOlC,EAAKkC,IAAQ/J,IAErB6I,IAAI,SAAUkB,GACb,OACEvI,EAAuBuI,GACvB,IACAvI,EAAuBqG,EAAKkC,MAG/BjB,KAAK,KACR,SACArC,KAAKD,OAILwD,GACFpK,EAAiBqK,UAAYtF,EAAKxB,EAAe,YAC/C+G,GAAkBF,IAAuBhJ,EAEzCmJ,GAAc,CAChBC,QAqpBJ,gBAppBIH,SAAUC,IASZpK,EAAY,SAAUuK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJtK,EAAKsK,GACLnB,GACE3D,EAAO4E,GAAa,CAClBI,KAAM/J,EACNwD,MAAOqG,EACPG,KAAM1J,EAAI2J,WAEZzK,EACAE,IAMJ4B,EACEtB,EACA,SAAUkK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASlC,QAAQ5I,IAC3CC,EAAU4K,EAAME,UAGpBzK,GAOF,IAwDI0K,GAxDAC,GAAQtE,KAERuE,GAAW,EAOXC,GAAOpL,EAAiBoL,MAAQrG,EAAKxB,EAAe,QAGpD8H,MA/KsBC,GA+KCtL,EAAiBqL,cA9KvBC,GA+KjBtL,EAAiBqL,WACjBtG,EAAKxB,EAAe,eAAiB/C,GACrCuE,EAAKxB,EAAe,aAAe/C,GACnCuE,EAAKxB,EAAe,gBAAkB/C,EAGtC+K,KACqC,SAAvCxG,EAAKxB,EAAe,iBACpBvD,EAAiBuL,cAAgBhL,GAI/BiL,GACFxL,EAAiByL,UACjB1G,EAAKxB,EAAe,cACpBuE,GAAY,IAAMnH,EAGhB+K,GAAcxG,EAChBlF,EAAiB0L,aAAe3G,EAAKxB,EAAe,iBAIlDyF,GAAc9D,EAChBlF,EAAiBgJ,aAAejE,EAAKxB,EAAe,iBAIlDoI,GAAqBzG,EACvBlF,EAAiB2L,oBACf5G,EAAKxB,EAAe,yBAIpBqI,GACF5L,EAAiB4L,gBAAkB7G,EAAKxB,EAAe,mBAGrD6E,GACFpI,EAAiBoI,mBACjBrD,EAAKxB,EAAe,sBAItB,IAEE0H,GAAWzE,GAAsB,KAC7BqF,KAAKC,iBAAiBC,kBAAkBC,SACxC5L,EACJ,MAAOgE,IACPjE,EAAKiE,IAOP,IAAI6H,GAAUlM,EAAOkM,QACjBC,GACFlL,EAAImL,WACJpM,EAAOqM,aACPrM,EAAOsM,aACPtM,EAAOuM,UACNL,KAAYA,GAAQM,QACrBxM,EAAOyM,YACPzM,EAAO0M,MACPrJ,GACAqE,KAAKC,UAAYD,KAAKC,SAGpBgF,GACFlG,GAAsB,MAAQA,GAAsB,QAElD0F,KAAK3B,GAAY2B,IAAM5L,GAE3B,IAAImJ,GAAU9D,EAAO4E,GAAa,CAEhCoC,GAAInG,GAAsB,MAAQhF,EAAYpB,EAE9CK,MAAOS,EAAImB,UAAY5B,EACvBwK,SAAUA,GACV2B,sBAAuBtM,EACvBuM,QAASxG,KAAeqG,GAAqB5F,KAAS1G,GAGtD0M,WAAYtG,GAAsB,MAC9BH,IAAcS,KACd1G,IA0BN,GAvBAqJ,GAAQsD,IAAMzM,EAIVoC,IACF+G,GAAQuD,OAAStK,EAAOsK,OACxBvD,GAAQwD,OAASjL,EAAUU,EAAOuK,SAS/B3L,EAAI4L,SAAS/M,EAAK,4CAInBmK,KAAoBlJ,IACtBqI,GAAQ0D,kBAAoB/L,IAGzBiK,IAActK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBmC,EAAU,SAK7B,GAAlC9B,EAAiByH,QAAQ,OACxB,aAAaxF,KAAKjC,IACnBgJ,IAEDjK,EACE,mBACEiB,EACA,SACA8B,EACA,0BAON,IACIkK,GA0DAC,GA3DA3D,GAAO,GAGP4D,GAAc,WAKhB,OAFEtN,EAAiBuN,UAAYxI,EAAKxB,EAAe,aAGzBjC,EAAIiM,UAAY,IACrCzI,QAAQ1D,EAAkBkJ,IAC1BxF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS1E,GAKjCmN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKjB,GAAL,CAEA,IAAIkB,EAASjI,EAAO4E,GAAa,CAC/BI,KAAM,SACNkD,YAAaF,EAAOD,EAAKjE,GAAQoD,UAenC,GAXIrG,GAAsB,OACxBoH,EAAOE,SAAWrG,KAAKsG,OAAOnH,KAAQsE,GAAQsC,IAlhBnC,MAohBbA,GAAW,EACXtC,GAAQtE,KAGJJ,GAAsB,UACxBoH,EAAOzC,SAAW1D,KAAKuG,IAAI,EAAG7C,GAAU8C,OAGtCN,IAAS3M,EAAIkN,WAEf5E,GAASsE,EAAQxN,EAAcE,QAE/B,IACEU,EAAIkN,WAAWC,KAAKnN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU4L,IAC3D,MAAOQ,GAEP9E,GAASsE,EAAQxN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAI+M,QACA,KAAOtL,KAAYhD,GAAS0N,KAClCJ,GAAczG,MACT4G,IAAY5G,KAAQyG,IAE7B9M,GAGF2B,EAAqBa,EAAU0K,GAAalN,GAE5C,IAAI+N,GAAOhN,EAAIgN,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuBjM,EAAgBQ,IAAiB,EACxD0L,EAAS/G,KAAKuG,IAChBM,GAAK1L,IAAiB,EACtB0L,GAAKzL,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO4E,KAAKgH,IACV,IAKI,EAJJhH,KAAKsG,MACF,MAAQzL,EAAgBoM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOpK,IAEP,OADAjE,EAAKiE,IACE,IAIXlC,EAAqB,OAAQ,WAC3BiJ,GAAW8C,KACX/L,EACEO,EACA,WACM0I,GAAW8C,OAAY9C,GAAW8C,OAExC1N,KAQJ,IAgCIoO,GAuCAC,GAAUC,GAvEVC,GAAU,SAAUC,GACtB,IAAInE,EAAO,GAIX,IACEA,EAAOmE,GAAajN,EAAuBZ,EAAI2J,UAC/C,MAAOzG,IACPjE,EAAKiE,IAGP,IAAI4K,EAAyBjP,EAAO6L,IACpC,GAAIjE,GAAWqH,GACb,IACEpE,EAAOoE,EAAuBpL,KAAK7D,EAAQ,CAAE6K,KAAMA,KAAWA,EAC9D,MAAOxG,IACPF,EAAe,OAAQE,IAK3B,IA/YiB,SAAUwG,GAC3B,IAAK,IAAIhC,KAAK8C,GAAa,CACzB,IAAIuD,EAAgBvD,GAAY9C,GAChC,GAAKqG,EAAL,CAGA,IAAIC,EA1PI,KA2PND,EAAc,GAAcA,EA3PtB,IA2P8CA,EAEtD,GACEC,IAAetE,GACf,IAAIjE,OACF,IAAM/B,EAAYsK,GAAYpK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKuH,GAEP,OAAOtK,GAEX,OAAOC,EA6XH4O,CAAavE,GAQjB,MAFY,QAARQ,IAAkBlK,EAAIkO,OAAMxE,GAAQ1J,EAAIkO,KAAK7J,MAAM,KAAK,IAErDqF,EAPLzK,EAAKuB,EAAiB,YAAckJ,IAmDpCyE,GAAW,SACbC,EACAC,EACAvH,EACAwH,IAEKA,GAAe7H,GAAWK,KAAWwH,EAAcxH,GACxD,IACIyH,EAGEC,EAJFnG,EAAW5B,GAAW6H,GAAeA,EAAc,aAEnD9K,EAAS6K,KAAgD,EAA9BA,EAAc1G,QAAQ,OAGnD0G,GADIG,EAAQH,EAAchK,MAAM,MACVoK,QACtBF,EAAc,IAAMC,EAAMxG,KAAK,MAGjC,IAAI0B,EAAOkE,GAAQS,GAGnB,GAAK3E,GAAQwC,IAAgBxC,EAA7B,CAEAwC,GAAexC,EACflB,GAAKkB,KAAOA,EAGRpE,GAAsB,OACxBkD,GAAKkG,eACHnI,KAAKuG,IAAI1L,EAA2B,aAAK,EAAGvC,EAAO8P,YAAc,IACjE,KACFnG,GAAKoG,gBACHrI,KAAKuG,IACH1L,EAAgBQ,IAAiB,EACjC/C,EAAOgQ,aAAe,IACnB,MAILvJ,GAAsB,MACpBxF,EAAIuB,KAAWmH,GAAKnH,GAAYvB,EAAIuB,IAItCe,GAAUkD,GAAsB,QAClCkD,GAAKsG,aAAe1M,EAAO2M,MAC3BvG,GAAKwG,cAAgB5M,EAAOkL,QAI9B,IAII2B,EAJAC,EAAOrQ,EAAOsQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG3F,KAC/D,MAAOvG,IACPjE,EAAKiE,IAGPyK,GAAgBsB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBtH,QAAQsH,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGzH,QAAQuH,EAAKE,GAAgB3F,MAGxC,IAAI6F,EAA0BjD,GAC1BA,GAAShI,MA5vBH,KA4vBgB,GACtBnF,EACJwO,GAAWrB,IACgD,EAAvD5B,GAAmB9C,QAAQ2H,IAC3BA,GAA2BpP,EAC3Bb,EAGJmJ,GAAK+G,OACH,QAAQpN,KAAKiK,OAAkBgC,GAAeT,GAC1CtO,GACCqO,GAEP5G,EAAWD,GAAeC,EAAU,CAClC2C,KAAMjK,EACNkK,KAAMlB,GAAKkB,OAGb,IAAI8F,EAAsB,WACxB/O,EAA2BrB,EAC3B,IAAIqQ,EACFrB,GAAeT,KAAkBrI,GAAsB,MAhI1C,SACjB8I,EACAsB,EACAhC,EACAlG,EACAV,EACAuB,GAEI+F,GAAa7B,GAAY,GAAKhE,GAAQoD,QAASvM,GACnD,IAAIuQ,EAAuB,IAAV1N,EAAckD,GAAajG,EAC5CqJ,GAAQoD,QACNgE,IAAenE,GAAqB5F,KAAS1G,GAE/C,IAAI0Q,EAAcxG,GAAkBwE,KAChCiC,EAAQzI,GAAesI,EAAkBlI,GAE7CY,GACE,CACEoE,GAAIjE,GAAQoD,QACZgB,YAAagD,EACblG,KAAMkG,EAAa,SAAWnQ,EAC9B6M,UAAWqD,GAAoBhC,EAAWrB,GAAW,KACrDwD,MAAOA,EACPzK,EAAGA,GAEH0B,SAAUhG,EAAUgG,IAEtBuB,GAGFoF,GAAmBpB,GACnBA,GAAWuD,EAEX3N,IAgGE6N,CACE1B,EACAqB,EACA/B,GACAa,EACAzH,EACAuB,IAIJ,GAAK5H,EAmBH+O,SAjBA,IACMhO,GAAUiF,GAAWjF,EAAOuO,sBAC9BvO,EACGuO,qBAAqB,CAACjO,EAAcC,IACpCiO,KAAK,SAAUC,GACd1H,GAAQ2H,QAAUD,EAAkBnO,GACpCyG,GAAQ4H,WAAaF,EAAkBlO,GACvCyN,MAEDY,SAAMZ,GAETA,IAEF,MAAOtC,GACPsC,OAWFa,GAAMxR,EAAOyR,QACbC,GAAeF,GAAMA,GAAIG,UAAYtR,EACrCuR,GAAM5R,EAAO6R,cACbC,GAAgB,YAIhBtG,IAAekG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB5G,GAoBAkH,IAlBrB,WACL,IAEI/G,EAFAjF,EAAMhC,UACNmO,EAAKD,GAAK9N,MAAMgO,KAAMpM,GAY1B,OAVI8B,GAAWmK,OACbhH,EAAQ,IAAIgH,MAAMnH,KAIlBG,EAAQxJ,EAAI4Q,YAAY,UAClBC,UAAUxH,GAAMrK,EAASA,GAEjCwK,EAAMjH,UAAYgC,EAClB8L,GAAI7G,GACGkH,IAMX9P,EACE2P,GACA,WACExC,GAAS,IAEX9O,GAGF2B,EACE,WACA,WACEmN,GAAS,IAEX9O,IAKAgL,IAAuB,QAARH,IAAkB,iBAAkBrL,GACrDmC,EACE,aACA,WACEmN,GAAS,IAEX9O,GAIAgL,IAAa8D,KAEjBtP,EAAOqS,YAAc,SAAUxH,EAAM5C,EAAUuB,GAC7C8F,GAAS,EAAGzE,EAAM5C,EAAUuB,IAQ9B,IAAI8I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUxH,EAAO9C,EAAUwH,IACpCA,GAAe7H,GAAWK,KAAWwH,EAAcxH,GAExD,IAAIuK,EAAkB5K,GAAWmD,GAC7BvB,EAAW5B,GAAW6H,GAAeA,EAAc,aACnDgD,SAAmB1H,EAEvB,GAAIuH,GAAWxJ,QAAQ2J,GAAa,IAAMD,EAExC,OADArO,EAAesH,GAAmB7K,EAAY,aAAe6R,GACtDjJ,IAGT,IACE,GAAIgJ,EAAiB,CACnB,IAAIE,EAAc3H,IAClB,GAAIuH,GAAWxJ,eAAe4J,GAAe,EAK3C,OAJAvO,EACEsH,GACAV,EAAQ,uBAAyB2H,GAE5BlJ,IAETuB,EAAQ2H,GAEV,MAAOrO,IAEP,OADAF,EAAesH,GAAmBpH,IAC3BmF,IAGTuB,GAAS,GAAKA,GAAOhG,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAI4N,EAAc,CAAE/H,KAAMhK,EAAWmK,MAAOA,GACxC6H,GAAa9D,IAAiB1L,EAAQ,EAE1C6E,EAAWD,GAAeC,EAAU0K,GAEhC5H,GACFxB,GACE3D,EAAO+M,EAAa,CAClBhF,GAAI5G,KACJiK,MAAOzI,IAAgBqK,GACvBpF,UACGoF,GAAa/D,KAAapI,GAAsB,KAC7CmI,GACA,KAEN3G,SAAUhG,EAAUgG,KAEtBuB,IAKFqJ,GAAmB,SAAU9H,EAAO9C,EAAUuB,GAChD+I,GAAUxH,EAAO9C,EAAUuB,IAIxBxJ,EAAOyL,MACVzL,EAAOyL,IAAqBoH,IAE9B,IAAIC,GAAY9S,EAAOyL,IAGnBsH,GAAQD,IAAaA,GAAUpK,EAAIoK,GAAUpK,EAAI,GAMrD,IAAK,IAAIqC,MAHT/K,EAAOyL,IAAqBoH,GAGVE,GACZzO,EAAQyO,GAAOhI,MACjB1F,MAAMC,QAAQyN,GAAMhI,KAChBwH,GAAUrO,MAAM,KAAM6O,GAAMhI,KAC5BwH,GAAUQ,GAAMhI,MAGxB,MAAOsD,IACPlO,EAAUkO,IA7IY,IAAUzD,GACxBoH,GA3nBkBzG,GA/N9B,CAy+BEvL,OACA,uBACA"} \ No newline at end of file +{"version":3,"file":"app.js","sources":["app.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n pageLoadId = undefinedVar;\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAAaC,iBAA0BpC,EACvCqC,EAAkBhB,EAAIgB,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAAS1B,EAAI2B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK7B,KAAe,WAAW6B,KAAK7B,GACxD8B,EAASvD,EAAOuD,OAIhBC,EACFjC,EAAIkC,eAAiBlC,EAAImC,cAAc,gBAAkBxD,EAAU,MAOrEE,EAAO,WAEL,IAAIuD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK/C,EAAIV,KAAMU,EAAK6C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnCjE,EAAK,iBAAmBgE,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWlG,EAAOmG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKpG,GAAkBsF,OAG5DtF,EAAmB2F,EAAO3F,EAAkBiG,GAExCE,GAAahG,EAAK,WAAYH,GAGlC,IAAIqG,GACFrG,EAAiBqG,YAActB,EAAKxB,EAAe,gBAE7B,iBAAf8C,IACN,yEAAyEhD,KACxEgD,MAGFA,GAAajG,GAIf,IA+EIkG,GA/EAC,GAAgBrB,EAClBlF,EAAiBuG,eAAiBxB,EAAKxB,EAAe,mBAGpDiD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU7B,GAC7B,OAAO,IAAI8B,OAAO,IAAMF,GAAoBpD,KAAKwB,KAChDS,QAIHsB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAehH,EAAOiH,QAAUjH,EAAOkH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOnD,GACP,OAAO8C,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF9H,EAAiB6H,KACjB9C,EAAKxB,EAAesE,KAwyBxB,KAryBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBnI,EAAO+H,GAAY,aACpCtC,EAAS0C,KAAiBF,EAAWrC,EAAOqC,EAAUE,IAC1D,IAAIC,EAA4BpI,EAAOqI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACFjI,EACEiI,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOrC,EACLqC,EACAG,EAA0BvE,KAAK7D,EAAQ4F,EAAOqC,EAAUC,KAE1D,MAAO7D,GACPF,EAAe,WAAYE,KAU3BiE,GACFrI,EAAiBqI,WACjBtD,EAAKxB,EAAe,eAAiB/C,EAInC8H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAKjG,EACvD,IAAIkI,GAAKD,GAAmBtH,EAAIwH,QAC7B/E,MAAM,GACN4B,MAAM,KACNmB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM/F,GAAgB,EAAJqI,GAASD,EAAShF,MAAMiF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAShF,MAAM,EAAGiF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIrE,GAAasE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAY1D,OAAe/E,EAInC,IAAIoG,OAAOwC,EAAO,KAAK9F,KAAKsF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKlG,EACFqI,GAAKrI,GA+BVgJ,GAAiBtB,GAAY,UACjC,GAAI/H,EAAOqJ,KAAmB9I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOsJ,gBAAkB/I,EACzBP,EAAOqJ,IAAkB9I,EAOzB,IAAIgJ,GAAW,SAAUrB,EAAMsB,EAAUC,GACvCvB,EAAOuB,EAAevB,EAAOtC,EAAO8D,GAASC,GAAMzB,GAE/CjH,EAAI2I,QAAUH,IAAcvB,EAAK0B,MAAQrJ,GACzCU,EAAI4I,qBAAuBJ,IAAcvB,EAAK4B,KAAOvJ,GAGzD,IAAIwJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJ9H,EACA,eACAoC,OAAO4B,KAAK6B,GACTvB,OAAO,SAAUyD,GAChB,OAAOlC,EAAKkC,IAAQ/J,IAErB6I,IAAI,SAAUkB,GACb,OACEvI,EAAuBuI,GACvB,IACAvI,EAAuBqG,EAAKkC,MAG/BjB,KAAK,KACR,SACArC,KAAKD,OAILwD,GACFpK,EAAiBqK,UAAYtF,EAAKxB,EAAe,YAC/C+G,GAAkBF,IAAuBhJ,EAEzCmJ,GAAc,CAChBC,QAspBJ,gBArpBIH,SAAUC,IASZpK,EAAY,SAAUuK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJtK,EAAKsK,GACLnB,GACE3D,EAAO4E,GAAa,CAClBI,KAAM/J,EACNwD,MAAOqG,EACPG,KAAM1J,EAAI2J,WAEZzK,EACAE,IAMJ4B,EACEtB,EACA,SAAUkK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASlC,QAAQ5I,IAC3CC,EAAU4K,EAAME,UAGpBzK,GAOF,IAwDI0K,GAxDAC,GAAQtE,KAERuE,GAAW,EAOXC,GAAOpL,EAAiBoL,MAAQrG,EAAKxB,EAAe,QAGpD8H,MA/KsBC,GA+KCtL,EAAiBqL,cA9KvBC,GA+KjBtL,EAAiBqL,WACjBtG,EAAKxB,EAAe,eAAiB/C,GACrCuE,EAAKxB,EAAe,aAAe/C,GACnCuE,EAAKxB,EAAe,gBAAkB/C,EAGtC+K,KACqC,SAAvCxG,EAAKxB,EAAe,iBACpBvD,EAAiBuL,cAAgBhL,GAI/BiL,GACFxL,EAAiByL,UACjB1G,EAAKxB,EAAe,cACpBuE,GAAY,IAAMnH,EAGhB+K,GAAcxG,EAChBlF,EAAiB0L,aAAe3G,EAAKxB,EAAe,iBAIlDyF,GAAc9D,EAChBlF,EAAiBgJ,aAAejE,EAAKxB,EAAe,iBAIlDoI,GAAqBzG,EACvBlF,EAAiB2L,oBACf5G,EAAKxB,EAAe,yBAIpBqI,GACF5L,EAAiB4L,gBAAkB7G,EAAKxB,EAAe,mBAGrD6E,GACFpI,EAAiBoI,mBACjBrD,EAAKxB,EAAe,sBAItB,IAEE0H,GAAWzE,GAAsB,KAC7BqF,KAAKC,iBAAiBC,kBAAkBC,SACxC5L,EACJ,MAAOgE,IACPjE,EAAKiE,IAOP,IAAI6H,GAAUlM,EAAOkM,QACjBC,GACFlL,EAAImL,WACJpM,EAAOqM,aACPrM,EAAOsM,aACPtM,EAAOuM,UACNL,KAAYA,GAAQM,QACrBxM,EAAOyM,YACPzM,EAAO0M,MACPrJ,GACAqE,KAAKC,UAAYD,KAAKC,SAGpBgF,GACFlG,GAAsB,MAAQA,GAAsB,QAElD0F,KAAK3B,GAAY2B,IAAM5L,GAE3B,IAAImJ,GAAU9D,EAAO4E,GAAa,CAEhCoC,GAAInG,GAAsB,MAAQhF,EAAYpB,EAE9CK,MAAOS,EAAImB,UAAY5B,EACvBwK,SAAUA,GACV2B,sBAAuBtM,EACvBuM,QAASxG,KAAeqG,GAAqB5F,KAAS1G,GAGtD0M,WAAYtG,GAAsB,MAC9BH,IAAcS,KACd1G,IA0BN,GAvBAqJ,GAAQsD,IAAMzM,EAIVoC,IACF+G,GAAQuD,OAAStK,EAAOsK,OACxBvD,GAAQwD,OAASjL,EAAUU,EAAOuK,SAS/B3L,EAAI4L,SAAS/M,EAAK,4CAInBmK,KAAoBlJ,IACtBqI,GAAQ0D,kBAAoB/L,IAGzBiK,IAActK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBmC,EAAU,SAK7B,GAAlC9B,EAAiByH,QAAQ,OACxB,aAAaxF,KAAKjC,IACnBgJ,IAEDjK,EACE,mBACEiB,EACA,SACA8B,EACA,0BAON,IACIkK,GA0DAC,GA3DA3D,GAAO,GAGP4D,GAAc,WAKhB,OAFEtN,EAAiBuN,UAAYxI,EAAKxB,EAAe,aAGzBjC,EAAIiM,UAAY,IACrCzI,QAAQ1D,EAAkBkJ,IAC1BxF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS1E,GAKjCmN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKjB,GAAL,CAEA,IAAIkB,EAASjI,EAAO4E,GAAa,CAC/BI,KAAM,SACNkD,YAAaF,EAAOD,EAAKjE,GAAQoD,UAenC,GAXIrG,GAAsB,OACxBoH,EAAOE,SAAWrG,KAAKsG,OAAOnH,KAAQsE,GAAQsC,IAlhBnC,MAohBbA,GAAW,EACXtC,GAAQtE,KAGJJ,GAAsB,UACxBoH,EAAOzC,SAAW1D,KAAKuG,IAAI,EAAG7C,GAAU8C,OAGtCN,IAAS3M,EAAIkN,WAEf5E,GAASsE,EAAQxN,EAAcE,QAE/B,IACEU,EAAIkN,WAAWC,KAAKnN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU4L,IAC3D,MAAOQ,GAEP9E,GAASsE,EAAQxN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAI+M,QACA,KAAOtL,KAAYhD,GAAS0N,KAClCJ,GAAczG,MACT4G,IAAY5G,KAAQyG,IAE7B9M,GAGF2B,EAAqBa,EAAU0K,GAAalN,GAE5C,IAAI+N,GAAOhN,EAAIgN,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuBjM,EAAgBQ,IAAiB,EACxD0L,EAAS/G,KAAKuG,IAChBM,GAAK1L,IAAiB,EACtB0L,GAAKzL,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO4E,KAAKgH,IACV,IAKI,EAJJhH,KAAKsG,MACF,MAAQzL,EAAgBoM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOpK,IAEP,OADAjE,EAAKiE,IACE,IAIXlC,EAAqB,OAAQ,WAC3BiJ,GAAW8C,KACX/L,EACEO,EACA,WACM0I,GAAW8C,OAAY9C,GAAW8C,OAExC1N,KAQJ,IAiCIoO,GAuCAC,GAAUC,GAxEVC,GAAU,SAAUC,GACtB,IAAInE,EAAO,GAIX,IACEA,EAAOmE,GAAajN,EAAuBZ,EAAI2J,UAC/C,MAAOzG,IACPjE,EAAKiE,IAGP,IAAI4K,EAAyBjP,EAAO6L,IACpC,GAAIjE,GAAWqH,GACb,IACEpE,EAAOoE,EAAuBpL,KAAK7D,EAAQ,CAAE6K,KAAMA,KAAWA,EAC9D,MAAOxG,IACPF,EAAe,OAAQE,IAK3B,OA/YiB,SAAUwG,GAC3B,IAAK,IAAIhC,KAAK8C,GAAa,CACzB,IAAIuD,EAAgBvD,GAAY9C,GAChC,GAAKqG,EAAL,CAGA,IAAIC,EA1PI,KA2PND,EAAc,GAAcA,EA3PtB,IA2P8CA,EAEtD,GACEC,IAAetE,GACf,IAAIjE,OACF,IAAM/B,EAAYsK,GAAYpK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKuH,GAEP,OAAOtK,GAEX,OAAOC,EA6XH4O,CAAavE,IACfvE,GAAajG,OACbD,EAAKuB,EAAiB,YAAckJ,KAK1B,QAARQ,IAAkBlK,EAAIkO,OAAMxE,GAAQ1J,EAAIkO,KAAK7J,MAAM,KAAK,IAErDqF,IA4CLyE,GAAW,SACbC,EACAC,EACAvH,EACAwH,IAEKA,GAAe7H,GAAWK,KAAWwH,EAAcxH,GACxD,IACIyH,EAGEC,EAJFnG,EAAW5B,GAAW6H,GAAeA,EAAc,aAEnD9K,EAAS6K,KAAgD,EAA9BA,EAAc1G,QAAQ,OAGnD0G,GADIG,EAAQH,EAAchK,MAAM,MACVoK,QACtBF,EAAc,IAAMC,EAAMxG,KAAK,MAGjC,IAAI0B,EAAOkE,GAAQS,GAGnB,GAAK3E,GAAQwC,IAAgBxC,EAA7B,CAEAwC,GAAexC,EACflB,GAAKkB,KAAOA,EAGRpE,GAAsB,OACxBkD,GAAKkG,eACHnI,KAAKuG,IAAI1L,EAA2B,aAAK,EAAGvC,EAAO8P,YAAc,IACjE,KACFnG,GAAKoG,gBACHrI,KAAKuG,IACH1L,EAAgBQ,IAAiB,EACjC/C,EAAOgQ,aAAe,IACnB,MAILvJ,GAAsB,MACpBxF,EAAIuB,KAAWmH,GAAKnH,GAAYvB,EAAIuB,IAItCe,GAAUkD,GAAsB,QAClCkD,GAAKsG,aAAe1M,EAAO2M,MAC3BvG,GAAKwG,cAAgB5M,EAAOkL,QAI9B,IAII2B,EAJAC,EAAOrQ,EAAOsQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG3F,KAC/D,MAAOvG,IACPjE,EAAKiE,IAGPyK,GAAgBsB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBtH,QAAQsH,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGzH,QAAQuH,EAAKE,GAAgB3F,MAGxC,IAAI6F,EAA0BjD,GAC1BA,GAAShI,MA7vBH,KA6vBgB,GACtBnF,EACJwO,GAAWrB,IACgD,EAAvD5B,GAAmB9C,QAAQ2H,IAC3BA,GAA2BpP,EAC3Bb,EAGJmJ,GAAK+G,OACH,QAAQpN,KAAKiK,OAAkBgC,GAAeT,GAC1CtO,GACCqO,GAEP5G,EAAWD,GAAeC,EAAU,CAClC2C,KAAMjK,EACNkK,KAAMlB,GAAKkB,OAGb,IAAI8F,EAAsB,WACxB/O,EAA2BrB,EAC3B,IAAIqQ,EACFrB,GAAeT,KAAkBrI,GAAsB,MAhI1C,SACjB8I,EACAsB,EACAhC,EACAlG,EACAV,EACAuB,GAEI+F,GAAa7B,GAAY,GAAKhE,GAAQoD,QAASvM,GACnD,IAAIuQ,EAAuB,IAAV1N,EAAckD,GAAajG,EAC5CqJ,GAAQoD,QACNgE,IAAenE,GAAqB5F,KAAS1G,GAE/C,IAAI0Q,EAAcxG,GAAkBwE,KAChCiC,EAAQzI,GAAesI,EAAkBlI,GAE7CY,GACE,CACEoE,GAAIjE,GAAQoD,QACZgB,YAAagD,EACblG,KAAMkG,EAAa,SAAWnQ,EAC9B6M,UAAWqD,GAAoBhC,EAAWrB,GAAW,KACrDwD,MAAOA,EACPzK,EAAGA,GAEH0B,SAAUhG,EAAUgG,IAEtBuB,GAGFoF,GAAmBpB,GACnBA,GAAWuD,EAEX3N,IAgGE6N,CACE1B,EACAqB,EACA/B,GACAa,EACAzH,EACAuB,IAIJ,GAAK5H,EAmBH+O,SAjBA,IACMhO,GAAUiF,GAAWjF,EAAOuO,sBAC9BvO,EACGuO,qBAAqB,CAACjO,EAAcC,IACpCiO,KAAK,SAAUC,GACd1H,GAAQ2H,QAAUD,EAAkBnO,GACpCyG,GAAQ4H,WAAaF,EAAkBlO,GACvCyN,MAEDY,SAAMZ,GAETA,IAEF,MAAOtC,GACPsC,OAWFa,GAAMxR,EAAOyR,QACbC,GAAeF,GAAMA,GAAIG,UAAYtR,EACrCuR,GAAM5R,EAAO6R,cACbC,GAAgB,YAIhBtG,IAAekG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB5G,GAoBAkH,IAlBrB,WACL,IAEI/G,EAFAjF,EAAMhC,UACNmO,EAAKD,GAAK9N,MAAMgO,KAAMpM,GAY1B,OAVI8B,GAAWmK,OACbhH,EAAQ,IAAIgH,MAAMnH,KAIlBG,EAAQxJ,EAAI4Q,YAAY,UAClBC,UAAUxH,GAAMrK,EAASA,GAEjCwK,EAAMjH,UAAYgC,EAClB8L,GAAI7G,GACGkH,IAMX9P,EACE2P,GACA,WACExC,GAAS,IAEX9O,GAGF2B,EACE,WACA,WACEmN,GAAS,IAEX9O,IAKAgL,IAAuB,QAARH,IAAkB,iBAAkBrL,GACrDmC,EACE,aACA,WACEmN,GAAS,IAEX9O,GAIAgL,IAAa8D,KAEjBtP,EAAOqS,YAAc,SAAUxH,EAAM5C,EAAUuB,GAC7C8F,GAAS,EAAGzE,EAAM5C,EAAUuB,IAQ9B,IAAI8I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUxH,EAAO9C,EAAUwH,IACpCA,GAAe7H,GAAWK,KAAWwH,EAAcxH,GAExD,IAAIuK,EAAkB5K,GAAWmD,GAC7BvB,EAAW5B,GAAW6H,GAAeA,EAAc,aACnDgD,SAAmB1H,EAEvB,GAAIuH,GAAWxJ,QAAQ2J,GAAa,IAAMD,EAExC,OADArO,EAAesH,GAAmB7K,EAAY,aAAe6R,GACtDjJ,IAGT,IACE,GAAIgJ,EAAiB,CACnB,IAAIE,EAAc3H,IAClB,GAAIuH,GAAWxJ,eAAe4J,GAAe,EAK3C,OAJAvO,EACEsH,GACAV,EAAQ,uBAAyB2H,GAE5BlJ,IAETuB,EAAQ2H,GAEV,MAAOrO,IAEP,OADAF,EAAesH,GAAmBpH,IAC3BmF,IAGTuB,GAAS,GAAKA,GAAOhG,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAI4N,EAAc,CAAE/H,KAAMhK,EAAWmK,MAAOA,GACxC6H,GAAa9D,IAAiB1L,EAAQ,EAE1C6E,EAAWD,GAAeC,EAAU0K,GAEhC5H,GACFxB,GACE3D,EAAO+M,EAAa,CAClBhF,GAAI5G,KACJiK,MAAOzI,IAAgBqK,GACvBpF,UACGoF,GAAa/D,KAAapI,GAAsB,KAC7CmI,GACA,KAEN3G,SAAUhG,EAAUgG,KAEtBuB,IAKFqJ,GAAmB,SAAU9H,EAAO9C,EAAUuB,GAChD+I,GAAUxH,EAAO9C,EAAUuB,IAIxBxJ,EAAOyL,MACVzL,EAAOyL,IAAqBoH,IAE9B,IAAIC,GAAY9S,EAAOyL,IAGnBsH,GAAQD,IAAaA,GAAUpK,EAAIoK,GAAUpK,EAAI,GAMrD,IAAK,IAAIqC,MAHT/K,EAAOyL,IAAqBoH,GAGVE,GACZzO,EAAQyO,GAAOhI,MACjB1F,MAAMC,QAAQyN,GAAMhI,KAChBwH,GAAUrO,MAAM,KAAM6O,GAAMhI,KAC5BwH,GAAUQ,GAAMhI,MAGxB,MAAOsD,IACPlO,EAAUkO,IA7IY,IAAUzD,GACxBoH,GA5nBkBzG,GA/N9B,CA0+BEvL,OACA,uBACA"} \ No newline at end of file diff --git a/dist/v12/custom/app.js b/dist/v12/custom/app.js index 4b22676..0632e3b 100644 --- a/dist/v12/custom/app.js +++ b/dist/v12/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 820d; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 74f6; SRI-version; v12) */ -!function(h,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); +!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v12/custom/app.js.map b/dist/v12/custom/app.js.map index e18e5cc..8a30962 100644 --- a/dist/v12/custom/app.js.map +++ b/dist/v12/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n pageLoadId = undefinedVar;\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/proxy.js b/dist/v12/custom/proxy.js index e9d5081..b82e51d 100644 --- a/dist/v12/custom/proxy.js +++ b/dist/v12/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 6842; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; ac94; SRI-version; v12) */ -!function(h,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",I="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); +!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",I="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v12/custom/proxy.js.map b/dist/v12/custom/proxy.js.map index 09e2285..151ab2b 100644 --- a/dist/v12/custom/proxy.js.map +++ b/dist/v12/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n pageLoadId = undefinedVar;\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 2f8fd97..688ea7c 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,15 @@ +minimumReleaseAge: 10080 +minimumReleaseAgeStrict: true +minimumReleaseAgeIgnoreMissingTime: false +trustPolicy: no-downgrade +trustLockfile: false +blockExoticSubdeps: true +engineStrict: true +strictDepBuilds: true +verifyDepsBeforeRun: error +allowBuilds: + fsevents: false + nodemon: false overrides: minimist@<1.2.6: ^1.2.8 minimatch@<3.1.4: ^3.1.4 diff --git a/src/default.js b/src/default.js index b84b0df..8f22eb3 100644 --- a/src/default.js +++ b/src/default.js @@ -767,6 +767,7 @@ /** if ignorepages **/ // Ignore pages specified in data-ignore-pages if (shouldIgnore(path)) { + pageLoadId = undefinedVar; warn(notSendingWhen + "ignoring " + path); return; } diff --git a/test/unit/page-load-id.test.js b/test/unit/page-load-id.test.js index 80c3ea9..6d41ecd 100644 --- a/test/unit/page-load-id.test.js +++ b/test/unit/page-load-id.test.js @@ -11,6 +11,23 @@ const requests = (dom) => const wait = () => new Promise((resolve) => setTimeout(resolve, 20)); describe("server page-load ID", function () { + it("does not merge a later pageview into an ignored initial page", async function () { + const dom = createDOM({ + settings: { pageLoadId, autoCollect: false, ignorePages: "/ignore" }, + }); + dom.window.sa_pageview("/ignore"); + dom.window.sa_pageview("/allowed"); + await wait(); + const allowed = requests(dom).filter( + (params) => params.get("path") === "/allowed" + ); + expect(allowed).to.have.lengthOf(1); + expect(allowed[0].get("type")).to.equal("pageview"); + expect(allowed[0].has("original_id")).to.equal(false); + expect(allowed[0].get("id")).not.to.equal(pageLoadId); + dom.window.close(); + }); + it("links events emitted before a manual first pageview to the server record", async function () { const dom = createDOM({ settings: { pageLoadId, autoCollect: false } }); dom.window.sa_event("early_event"); From 70a3ed5e6956063662e37e01f35d6c1464095992 Mon Sep 17 00:00:00 2001 From: Simple Analytics Codex Date: Sun, 27 Sep 2026 21:36:33 +0300 Subject: [PATCH 4/9] Clear server attribution for ignored initial pageviews --- .github/workflows/browserstack.yml | 5 +++- dist/latest/cloudflare.js | 10 ++++++-- dist/latest/custom/app.js | 4 +-- dist/latest/custom/app.js.map | 2 +- dist/latest/custom/e.js | 4 +-- dist/latest/custom/e.js.map | 2 +- dist/latest/custom/latest.dev.js | 10 ++++++-- dist/latest/custom/latest.js | 4 +-- dist/latest/custom/latest.js.map | 2 +- dist/latest/custom/light.js | 4 +-- dist/latest/custom/light.js.map | 2 +- dist/latest/custom/proxy.js | 4 +-- dist/latest/custom/proxy.js.map | 2 +- dist/latest/hello.js | 4 +-- dist/latest/hello.js.map | 2 +- dist/latest/latest.dev.js | 10 ++++++-- dist/latest/latest.js | 4 +-- dist/latest/latest.js.map | 2 +- dist/latest/light.js | 4 +-- dist/latest/light.js.map | 2 +- dist/v12/app.js | 4 +-- dist/v12/app.js.map | 2 +- dist/v12/custom/app.js | 4 +-- dist/v12/custom/app.js.map | 2 +- dist/v12/custom/light.js | 4 +-- dist/v12/custom/light.js.map | 2 +- dist/v12/custom/proxy.js | 4 +-- dist/v12/custom/proxy.js.map | 2 +- dist/v12/light.js | 4 +-- dist/v12/light.js.map | 2 +- src/default.js | 8 +++++- test/unit/page-load-id.test.js | 41 ++++++++++++++++++++++++++++++ 32 files changed, 115 insertions(+), 47 deletions(-) diff --git a/.github/workflows/browserstack.yml b/.github/workflows/browserstack.yml index 659668c..838a5a3 100644 --- a/.github/workflows/browserstack.yml +++ b/.github/workflows/browserstack.yml @@ -51,6 +51,9 @@ jobs: - name: Install dependencies run: pnpm install --frozen-lockfile + - name: Build and test compiled scripts + run: pnpm run build && pnpm run test:unit + - name: Test BrowserStack matrix selection run: pnpm run test:matrix @@ -69,7 +72,7 @@ jobs: - name: Run tests with BrowserStack Local if: steps.browserstack.outputs.skip != 'true' - run: pnpm run build && node ./test/index.js + run: node ./test/index.js env: CI: true NODE_ENV: test diff --git a/dist/latest/cloudflare.js b/dist/latest/cloudflare.js index 8019739..f9920a0 100644 --- a/dist/latest/cloudflare.js +++ b/dist/latest/cloudflare.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; d163; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 4419; v12) */ /* eslint-env browser */ (function ( @@ -673,7 +673,6 @@ // Ignore pages specified in data-ignore-pages if (shouldIgnore(path)) { - pageLoadId = undefinedVar; warn(notSendingWhen + "ignoring " + path); return; } @@ -743,6 +742,13 @@ // Obfuscate personal data in URL by dropping the search and hash var path = getPath(pathOverwrite); + if (!path && pages === 0 && pageLoadId) { + // An ignored initial page must not receive event or leave enrichment. + payload.page_id = collectDataOnLeave ? uuid() : undefinedVar; + if (payload.session_id === pageLoadId) payload.session_id = uuid(); + pageLoadId = undefinedVar; + } + // Don't send the last path again (this could happen when pushState is used to change the path hash or search) if (!path || lastSendPath == path) return; diff --git a/dist/latest/custom/app.js b/dist/latest/custom/app.js index 753213e..766baec 100644 --- a/dist/latest/custom/app.js +++ b/dist/latest/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; b438; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; dc34; v12) */ -!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); +!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/latest/custom/app.js.map b/dist/latest/custom/app.js.map index b263293..e324e54 100644 --- a/dist/latest/custom/app.js.map +++ b/dist/latest/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n pageLoadId = undefinedVar;\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/e.js b/dist/latest/custom/e.js index 7061fa0..fb33111 100644 --- a/dist/latest/custom/e.js +++ b/dist/latest/custom/e.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 6e19; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; b467; v12) */ -!function(h,t,e,n,v){try{var m=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){v("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&v(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); +!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); //# sourceMappingURL=e.js.map \ No newline at end of file diff --git a/dist/latest/custom/e.js.map b/dist/latest/custom/e.js.map index cd3ef1a..7cddf80 100644 --- a/dist/latest/custom/e.js.map +++ b/dist/latest/custom/e.js.map @@ -1 +1 @@ -{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n pageLoadId = undefinedVar;\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/latest.dev.js b/dist/latest/custom/latest.dev.js index 223463f..07ed5f6 100644 --- a/dist/latest/custom/latest.dev.js +++ b/dist/latest/custom/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 8c8f; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 7846; v12) */ /* eslint-env browser */ (function ( @@ -673,7 +673,6 @@ // Ignore pages specified in data-ignore-pages if (shouldIgnore(path)) { - pageLoadId = undefinedVar; warn(notSendingWhen + "ignoring " + path); return; } @@ -743,6 +742,13 @@ // Obfuscate personal data in URL by dropping the search and hash var path = getPath(pathOverwrite); + if (!path && pages === 0 && pageLoadId) { + // An ignored initial page must not receive event or leave enrichment. + payload.page_id = collectDataOnLeave ? uuid() : undefinedVar; + if (payload.session_id === pageLoadId) payload.session_id = uuid(); + pageLoadId = undefinedVar; + } + // Don't send the last path again (this could happen when pushState is used to change the path hash or search) if (!path || lastSendPath == path) return; diff --git a/dist/latest/custom/latest.js b/dist/latest/custom/latest.js index c69e911..d05907a 100644 --- a/dist/latest/custom/latest.js +++ b/dist/latest/custom/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; cd74; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 6983; v12) */ -!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); +!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); //# sourceMappingURL=latest.js.map \ No newline at end of file diff --git a/dist/latest/custom/latest.js.map b/dist/latest/custom/latest.js.map index 7d417f9..a6080df 100644 --- a/dist/latest/custom/latest.js.map +++ b/dist/latest/custom/latest.js.map @@ -1 +1 @@ -{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n pageLoadId = undefinedVar;\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAhBW3B,WAgB4BR,EACvCoC,EAAkBf,EAAIe,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAASzB,EAAI0B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK5B,KAAe,WAAW4B,KAAK5B,GACxD6B,EAAStD,EAAOsD,OAIhBC,EACFhC,EAAIiC,eAAiBjC,EAAIkC,cAAc,gBAAkBvD,EAAU,MAOrEE,EAAO,WAEL,IAAIsD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK9C,EAAIV,KAAMU,EAAK4C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnChE,EAAK,iBAAmB+D,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWjG,EAAOkG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKnG,GAAkBqF,OAG5DrF,EAAmB0F,EAAO1F,EAAkBgG,GAExCE,GAAa/F,EAAK,WAAYH,GAGlC,IAAIoG,GACFpG,EAAiBoG,YAActB,EAAKxB,EAAe,gBAE7B,iBAAf8C,IACN,yEAAyEhD,KACxEgD,MAGFA,GAAahG,GAIf,IA+EIiG,GA/EAC,GAAgBrB,EAClBjF,EAAiBsG,eAAiBxB,EAAKxB,EAAe,mBAGpDiD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU7B,GAC7B,OAAO,IAAI8B,OAAO,IAAMF,GAAoBpD,KAAKwB,KAChDS,QAIHsB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe/G,EAAOgH,QAAUhH,EAAOiH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOnD,GACP,OAAO8C,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF7H,EAAiB4H,KACjB9C,EAAKxB,EAAesE,KA8yBxB,KA3yBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBlI,EAAO8H,GAAY,aACpCtC,EAAS0C,KAAiBF,EAAWrC,EAAOqC,EAAUE,IAC1D,IAAIC,EAA4BnI,EAAOoI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACFhI,EACEgI,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOrC,EACLqC,EACAG,EAA0BvE,KAAK5D,EAAQ2F,EAAOqC,EAAUC,KAE1D,MAAO7D,GACPF,EAAe,WAAYE,KAU3BiE,GACFpI,EAAiBoI,WACjBtD,EAAKxB,EAAe,eAAiB9C,EAInC6H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAKhG,EACvD,IAAIiI,GAAKD,GAAmBrH,EAAIuH,QAC7B/E,MAAM,GACN4B,MAAM,KACNmB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM9F,GAAgB,EAAJoI,GAASD,EAAShF,MAAMiF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAShF,MAAM,EAAGiF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIrE,GAAasE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAY1D,OAAe9E,EAInC,IAAImG,OAAOwC,EAAO,KAAK9F,KAAKsF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKjG,EACFoI,GAAKpI,GA+BV+I,GAAiBtB,GAAY,UACjC,GAAI9H,EAAOoJ,KAAmB7I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOqJ,gBAAkB9I,EACzBP,EAAOoJ,IAAkB7I,EAOzB,IAAI+I,GAAW,SAAUrB,EAAMsB,EAAUC,GACvCvB,EAAOuB,EAAevB,EAAOtC,EAAO8D,GAASC,GAAMzB,GAE/ChH,EAAI0I,QAAUH,IAAcvB,EAAK0B,MAAQpJ,GACzCU,EAAI2I,qBAAuBJ,IAAcvB,EAAK4B,KAAOtJ,GAGzD,IAAIuJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJ7H,EACA,eACAmC,OAAO4B,KAAK6B,GACTvB,OAAO,SAAUyD,GAChB,OAAOlC,EAAKkC,IAAQ9J,IAErB4I,IAAI,SAAUkB,GACb,OACEtI,EAAuBsI,GACvB,IACAtI,EAAuBoG,EAAKkC,MAG/BjB,KAAK,KACR,SACArC,KAAKD,OAILwD,GACFnK,EAAiBoK,UAAYtF,EAAKxB,EAAe,YAC/C+G,GAAkBF,IAAuB/I,EAEzCkJ,GAAc,CAChBC,QA4pBJ,mBA3pBIH,SAAUC,IASZnK,EAAY,SAAUsK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJrK,EAAKqK,GACLnB,GACE3D,EAAO4E,GAAa,CAClBI,KAAM9J,EACNuD,MAAOqG,EACPG,KAAMzJ,EAAI0J,WAEZxK,EACAE,IAMJ4B,EACEtB,EACA,SAAUiK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASlC,QAAQ3I,IAC3CC,EAAU2K,EAAME,UAGpBxK,GAOF,IAwDIyK,GAxDAC,GAAQtE,KAERuE,GAAW,EAOXC,GAAOnL,EAAiBmL,MAAQrG,EAAKxB,EAAe,QAGpD8H,MA/KsBC,GA+KCrL,EAAiBoL,cA9KvBC,GA+KjBrL,EAAiBoL,WACjBtG,EAAKxB,EAAe,eAAiB9C,GACrCsE,EAAKxB,EAAe,aAAe9C,GACnCsE,EAAKxB,EAAe,gBAAkB9C,EAGtC8K,KACqC,SAAvCxG,EAAKxB,EAAe,iBACpBtD,EAAiBsL,cAAgB/K,GAI/BgL,GACFvL,EAAiBwL,UACjB1G,EAAKxB,EAAe,cACpBuE,GAAY,IAAMlH,EAGhB8K,GAAcxG,EAChBjF,EAAiByL,aAAe3G,EAAKxB,EAAe,iBAIlDyF,GAAc9D,EAChBjF,EAAiB+I,aAAejE,EAAKxB,EAAe,iBAIlDoI,GAAqBzG,EACvBjF,EAAiB0L,oBACf5G,EAAKxB,EAAe,yBAIpBqI,GACF3L,EAAiB2L,gBAAkB7G,EAAKxB,EAAe,mBAGrD6E,GACFnI,EAAiBmI,mBACjBrD,EAAKxB,EAAe,sBAItB,IAEE0H,GAAWzE,GAAsB,KAC7BqF,KAAKC,iBAAiBC,kBAAkBC,SACxC3L,EACJ,MAAO+D,IACPhE,EAAKgE,IAOP,IAAI6H,GAAUjM,EAAOiM,QACjBC,GACFjL,EAAIkL,WACJnM,EAAOoM,aACPpM,EAAOqM,aACPrM,EAAOsM,UACNL,KAAYA,GAAQM,QACrBvM,EAAOwM,YACPxM,EAAOyM,MACPrJ,GACAqE,KAAKC,UAAYD,KAAKC,SAGpBgF,GACFlG,GAAsB,MAAQA,GAAsB,QAElD0F,KAAK3B,GAAY2B,IAAM3L,GAE3B,IAAIkJ,GAAU9D,EAAO4E,GAAa,CAEhCoC,GAAInG,GAAsB,MAAQ/E,EAAYpB,EAE9CK,MAAOS,EAAIyL,UAAYlM,EACvBuK,SAAUA,GACV4B,sBAAuBtM,EACvBuM,QAASzG,KAAeqG,GAAqB5F,KAASzG,GAGtD0M,WAAYvG,GAAsB,MAC9BH,IAAcS,KACdzG,IA0BN,GAvBAoJ,GAAQuD,IAAMxM,EAIVkC,IACF+G,GAAQwD,OAASvK,EAAOuK,OACxBxD,GAAQyD,OAASjL,EAAUS,EAAOwK,SAS/B3L,EAAI4L,SAAS/M,EAAK,4CAInBkK,KAAoBjJ,IACtBoI,GAAQ2D,kBAAoB/L,IAGzBgK,IAAcrK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBkC,EAAU,SAK7B,GAAlC7B,EAAiBwH,QAAQ,OACxB,aAAaxF,KAAKhC,IACnB+I,IAEDhK,EACE,mBACEiB,EACA,SACA6B,EACA,0BAON,IACImK,GA0DAC,GA3DA5D,GAAO,GAGP6D,GAAc,WAKhB,OAFEtN,EAAiBuN,UAAYzI,EAAKxB,EAAe,aAGzBhC,EAAIiM,UAAY,IACrC1I,QAAQzD,EAAkBiJ,IAC1BxF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAASzE,GAKjCmN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKlB,GAAL,CAEA,IAAImB,EAASlI,EAAO4E,GAAa,CAC/BI,KAAM,SACNmD,YAAaF,EAAOD,EAAKlE,GAAQqD,UAenC,GAXItG,GAAsB,OACxBqH,EAAOE,SAAWtG,KAAKuG,OAAOpH,KAAQsE,GAAQuC,IAlhBnC,MAohBbA,GAAW,EACXvC,GAAQtE,KAGJJ,GAAsB,UACxBqH,EAAO1C,SAAW1D,KAAKwG,IAAI,EAAG9C,GAAU+C,OAGtCN,IAAS3M,EAAIkN,WAEf7E,GAASuE,EAAQxN,EAAcE,QAE/B,IACEU,EAAIkN,WAAWC,KAAKnN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU4L,IAC3D,MAAOQ,GAEP/E,GAASuE,EAAQxN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAI+M,QACA,KAAOvL,KAAY/C,GAAS0N,KAClCJ,GAAc1G,MACT6G,IAAY7G,KAAQ0G,IAE7B9M,GAGF2B,EAAqBY,EAAU2K,GAAalN,GAE5C,IAAI+N,GAAOhN,EAAIgN,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuBlM,EAAgBQ,IAAiB,EACxD2L,EAAShH,KAAKwG,IAChBM,GAAK3L,IAAiB,EACtB2L,GAAK1L,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO4E,KAAKiH,IACV,IAKI,EAJJjH,KAAKuG,MACF,MAAQ1L,EAAgBqM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOrK,IAEP,OADAhE,EAAKgE,IACE,IAIXjC,EAAqB,OAAQ,WAC3BgJ,GAAW+C,KACX/L,EACEM,EACA,WACM0I,GAAW+C,OAAY/C,GAAW+C,OAExC1N,KAQJ,IAgCIoO,GAuCAC,GAAUC,GAvEVC,GAAU,SAAUC,GACtB,IAAIpE,EAAO,GAIX,IACEA,EAAOoE,GAAajN,EAAuBZ,EAAI0J,UAC/C,MAAOzG,IACPhE,EAAKgE,IAGP,IAAI6K,EAAyBjP,EAAO4L,IACpC,GAAIjE,GAAWsH,GACb,IACErE,EAAOqE,EAAuBrL,KAAK5D,EAAQ,CAAE4K,KAAMA,KAAWA,EAC9D,MAAOxG,IACPF,EAAe,OAAQE,IAK3B,IA/YiB,SAAUwG,GAC3B,IAAK,IAAIhC,KAAK8C,GAAa,CACzB,IAAIwD,EAAgBxD,GAAY9C,GAChC,GAAKsG,EAAL,CAGA,IAAIC,EA1PI,KA2PND,EAAc,GAAcA,EA3PtB,IA2P8CA,EAEtD,GACEC,IAAevE,GACf,IAAIjE,OACF,IAAM/B,EAAYuK,GAAYrK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKuH,GAEP,OAAOrK,GAEX,OAAOC,EA6XH4O,CAAaxE,GAQjB,MAFY,QAARQ,IAAkBjK,EAAIkO,OAAMzE,GAAQzJ,EAAIkO,KAAK9J,MAAM,KAAK,IAErDqF,EAPLxK,EAAKuB,EAAiB,YAAciJ,IAmDpC0E,GAAW,SACbC,EACAC,EACAxH,EACAyH,IAEKA,GAAe9H,GAAWK,KAAWyH,EAAczH,GACxD,IACI0H,EAGEC,EAJFpG,EAAW5B,GAAW8H,GAAeA,EAAc,aAEnD/K,EAAS8K,KAAgD,EAA9BA,EAAc3G,QAAQ,OAGnD2G,GADIG,EAAQH,EAAcjK,MAAM,MACVqK,QACtBF,EAAc,IAAMC,EAAMzG,KAAK,MAGjC,IAAI0B,EAAOmE,GAAQS,GAUnB,IARK5E,GAAkB,IAAVzH,GAAekD,KAE1BoD,GAAQqD,QAAUJ,GAAqB5F,KAASzG,EAC5CoJ,GAAQsD,aAAe1G,KAAYoD,GAAQsD,WAAajG,MAC5DT,GAAahG,GAIVuK,GAAQyC,IAAgBzC,EAA7B,CAEAyC,GAAezC,EACflB,GAAKkB,KAAOA,EAGRpE,GAAsB,OACxBkD,GAAKmG,eACHpI,KAAKwG,IAAI3L,EAA2B,aAAK,EAAGtC,EAAO8P,YAAc,IACjE,KACFpG,GAAKqG,gBACHtI,KAAKwG,IACH3L,EAAgBQ,IAAiB,EACjC9C,EAAOgQ,aAAe,IACnB,MAILxJ,GAAsB,MACpBvF,EAAIsB,KAAWmH,GAAKnH,GAAYtB,EAAIsB,IAItCe,GAAUkD,GAAsB,QAClCkD,GAAKuG,aAAe3M,EAAO4M,MAC3BxG,GAAKyG,cAAgB7M,EAAOmL,QAI9B,IAII2B,EAJAC,EAAOrQ,EAAOsQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG5F,KAC/D,MAAOvG,IACPhE,EAAKgE,IAGP0K,GAAgBsB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBvH,QAAQuH,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAG1H,QAAQwH,EAAKE,GAAgB5F,MAGxC,IAAI8F,EAA0BjD,GAC1BA,GAASjI,MAnwBH,KAmwBgB,GACtBlF,EACJwO,GAAWrB,IACgD,EAAvD7B,GAAmB9C,QAAQ4H,IAC3BA,GAA2BpP,EAC3Bb,EAGJkJ,GAAKgH,OACH,QAAQrN,KAAKkK,OAAkBgC,GAAeT,GAC1CtO,GACCqO,GAEP7G,EAAWD,GAAeC,EAAU,CAClC2C,KAAMhK,EACNiK,KAAMlB,GAAKkB,OAGb,IAAI+F,EAAsB,WACxB/O,EAA2BrB,EAC3B,IAAIqQ,EACFrB,GAAeT,KAAkBtI,GAAsB,MAvI1C,SACjB+I,EACAsB,EACAhC,EACAnG,EACAV,EACAuB,GAEIgG,GAAa7B,GAAY,GAAKjE,GAAQqD,QAASvM,GACnD,IAAIuQ,EAAuB,IAAV3N,EAAckD,GAAahG,EAC5CoJ,GAAQqD,QACNgE,IAAepE,GAAqB5F,KAASzG,GAE/C,IAAI0Q,EAAczG,GAAkByE,KAChCiC,EAAQ1I,GAAeuI,EAAkBnI,GAE7CY,GACE,CACEqE,GAAIlE,GAAQqD,QACZgB,YAAagD,EACbnG,KAAMmG,EAAa,SAAWnQ,EAC9B6M,UAAWqD,GAAoBhC,EAAWrB,GAAW,KACrDwD,MAAOA,EACP1K,EAAGA,GAEH0B,SAAU/F,EAAU+F,IAEtBuB,GAGFqF,GAAmBpB,GACnBA,GAAWuD,EAEX5N,IAuGE8N,CACE1B,EACAqB,EACA/B,GACAa,EACA1H,EACAuB,IAIJ,GAAK3H,EAmBH+O,SAjBA,IACMjO,GAAUiF,GAAWjF,EAAOwO,sBAC9BxO,EACGwO,qBAAqB,CAAClO,EAAcC,IACpCkO,KAAK,SAAUC,GACd3H,GAAQ4H,QAAUD,EAAkBpO,GACpCyG,GAAQ6H,WAAaF,EAAkBnO,GACvC0N,MAEDY,SAAMZ,GAETA,IAEF,MAAOtC,GACPsC,OAWFa,GAAMxR,EAAOyR,QACbC,GAAeF,GAAMA,GAAIG,UAAYtR,EACrCuR,GAAM5R,EAAO6R,cACbC,GAAgB,YAIhBvG,IAAemG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB7G,GAoBAmH,IAlBrB,WACL,IAEIhH,EAFAjF,EAAMhC,UACNoO,EAAKD,GAAK/N,MAAMiO,KAAMrM,GAY1B,OAVI8B,GAAWoK,OACbjH,EAAQ,IAAIiH,MAAMpH,KAIlBG,EAAQvJ,EAAI4Q,YAAY,UAClBC,UAAUzH,GAAMpK,EAASA,GAEjCuK,EAAMjH,UAAYgC,EAClB+L,GAAI9G,GACGmH,IAMX9P,EACE2P,GACA,WACExC,GAAS,IAEX9O,GAGF2B,EACE,WACA,WACEmN,GAAS,IAEX9O,IAKA+K,IAAuB,QAARH,IAAkB,iBAAkBpL,GACrDmC,EACE,aACA,WACEmN,GAAS,IAEX9O,GAIA+K,IAAa+D,KAEjBtP,EAAOqS,YAAc,SAAUzH,EAAM5C,EAAUuB,GAC7C+F,GAAS,EAAG1E,EAAM5C,EAAUuB,IAQ9B,IAAI+I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUzH,EAAO9C,EAAUyH,IACpCA,GAAe9H,GAAWK,KAAWyH,EAAczH,GAExD,IAAIwK,EAAkB7K,GAAWmD,GAC7BvB,EAAW5B,GAAW8H,GAAeA,EAAc,aACnDgD,SAAmB3H,EAEvB,GAAIwH,GAAWzJ,QAAQ4J,GAAa,IAAMD,EAExC,OADAtO,EAAesH,GAAmB5K,EAAY,aAAe6R,GACtDlJ,IAGT,IACE,GAAIiJ,EAAiB,CACnB,IAAIE,EAAc5H,IAClB,GAAIwH,GAAWzJ,eAAe6J,GAAe,EAK3C,OAJAxO,EACEsH,GACAV,EAAQ,uBAAyB4H,GAE5BnJ,IAETuB,EAAQ4H,GAEV,MAAOtO,IAEP,OADAF,EAAesH,GAAmBpH,IAC3BmF,IAGTuB,GAAS,GAAKA,GAAOhG,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAI6N,EAAc,CAAEhI,KAAM/J,EAAWkK,MAAOA,GACxC8H,GAAa9D,IAAiB3L,EAAQ,EAE1C6E,EAAWD,GAAeC,EAAU2K,GAEhC7H,GACFxB,GACE3D,EAAOgN,EAAa,CAClBhF,GAAI7G,KACJkK,MAAO1I,IAAgBsK,GACvBpF,UACGoF,GAAa/D,KAAarI,GAAsB,KAC7CoI,GACA,KAEN5G,SAAU/F,EAAU+F,KAEtBuB,IAKFsJ,GAAmB,SAAU/H,EAAO9C,EAAUuB,GAChDgJ,GAAUzH,EAAO9C,EAAUuB,IAIxBvJ,EAAOwL,MACVxL,EAAOwL,IAAqBqH,IAE9B,IAAIC,GAAY9S,EAAOwL,IAGnBuH,GAAQD,IAAaA,GAAUrK,EAAIqK,GAAUrK,EAAI,GAMrD,IAAK,IAAIqC,MAHT9K,EAAOwL,IAAqBqH,GAGVE,GACZ1O,EAAQ0O,GAAOjI,MACjB1F,MAAMC,QAAQ0N,GAAMjI,KAChByH,GAAUtO,MAAM,KAAM8O,GAAMjI,KAC5ByH,GAAUQ,GAAMjI,MAGxB,MAAOuD,IACPlO,EAAUkO,IA7IY,IAAU1D,GACxBqH,GAloBkB1G,GA/N9B,CAg/BEtL,OACA,uBACA"} \ No newline at end of file diff --git a/dist/latest/custom/light.js b/dist/latest/custom/light.js index 2b15e0c..2f6868d 100644 --- a/dist/latest/custom/light.js +++ b/dist/latest/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 3557; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 130e; v12) */ -!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,d=l.location,g=d.host,i=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,p=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,x=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var $=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},I=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||A(E,V)||"sa",C=e.strictUtm||"true"==A(E,"strict-utm"),H=B+"_loaded";if(1==l[H])return f(c+"twice");l.sa_event_loaded=!0,l[H]=!0;var T,F=function(t,e,n){t=n?t:I(M,Z,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||A(E,"hostname"),z=L||g,J={version:"custom_light_12",hostname:z};e.mode||A(E,"mode");try{T=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}x&&(J.bot=!0);var M=I(J,{ua:o,https:d.protocol==n,timezone:T,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!1,w&&(M.mobile=w.mobile,M.brands=v(w.brands)),z!==g&&(M.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||L||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||A(E,"referrer")||i.referrer||"").replace(g,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,K=function(e,t){var n=I(J,{type:"append",original_id:t?e:M.page_id});if(t||!m.sendBeacon)F(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){F(n,0,!0)}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:u;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||u);F({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);$(t)&&-1"); +!function(l,e,t,f){try{var g=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,d=l.location,h=d.host,i=l.document,o=m.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,p=decodeURIComponent,u=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,x=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var $=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},I=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||A(E,V)||"sa",C=e.strictUtm||"true"==A(E,"strict-utm"),H=B+"_loaded";if(1==l[H])return f(c+"twice");l.sa_event_loaded=!0,l[H]=!0;var T,F=function(t,e,n){t=n?t:I(M,Z,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=g}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||A(E,"hostname"),z=L||h,J={version:"custom_light_12",hostname:z};e.mode||A(E,"mode");try{T=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}x&&(J.bot=!0);var M=I(J,{ua:o,https:d.protocol==n,timezone:T,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!1,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==h&&(M.hostname_original=h),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||L||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||A(E,"referrer")||i.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||g,K=function(e,t){var n=I(J,{type:"append",original_id:t?e:M.page_id});if(t||!m.sendBeacon)F(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",u(n))}catch(r){F(n,0,!0)}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:g;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||g);F({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);$(t)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/latest/custom/light.js.map b/dist/latest/custom/light.js.map index f214dd4..b1329f5 100644 --- a/dist/latest/custom/light.js.map +++ b/dist/latest/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/proxy.js b/dist/latest/custom/proxy.js index 4cc13ef..ccbf0a7 100644 --- a/dist/latest/custom/proxy.js +++ b/dist/latest/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; a38f; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 7ea1; v12) */ -!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",I="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); +!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",I="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/latest/custom/proxy.js.map b/dist/latest/custom/proxy.js.map index 4f56cbf..39958fe 100644 --- a/dist/latest/custom/proxy.js.map +++ b/dist/latest/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n pageLoadId = undefinedVar;\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/hello.js b/dist/latest/hello.js index 13d8b8b..0c0aac5 100644 --- a/dist/latest/hello.js +++ b/dist/latest/hello.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; b860) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; f3be) */ -!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,q="https://queue."+e,M=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[Mt];if(!ot(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[Mt];if(!ot(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n pageLoadId = undefinedVar;\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"hello.source.js","sources":["hello.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/latest.dev.js b/dist/latest/latest.dev.js index 39fba00..78d8f56 100644 --- a/dist/latest/latest.dev.js +++ b/dist/latest/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 0c7f; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; f72b; v12) */ /* eslint-env browser */ (function ( @@ -673,7 +673,6 @@ // Ignore pages specified in data-ignore-pages if (shouldIgnore(path)) { - pageLoadId = undefinedVar; warn(notSendingWhen + "ignoring " + path); return; } @@ -743,6 +742,13 @@ // Obfuscate personal data in URL by dropping the search and hash var path = getPath(pathOverwrite); + if (!path && pages === 0 && pageLoadId) { + // An ignored initial page must not receive event or leave enrichment. + payload.page_id = collectDataOnLeave ? uuid() : undefinedVar; + if (payload.session_id === pageLoadId) payload.session_id = uuid(); + pageLoadId = undefinedVar; + } + // Don't send the last path again (this could happen when pushState is used to change the path hash or search) if (!path || lastSendPath == path) return; diff --git a/dist/latest/latest.js b/dist/latest/latest.js index d9aa971..f91a5c8 100644 --- a/dist/latest/latest.js +++ b/dist/latest/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 389a; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 23a4; v12) */ -!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,q="https://queue."+e,M=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[Mt];if(!ot(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[Mt];if(!ot(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n pageLoadId = undefinedVar;\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/light.js b/dist/latest/light.js index 9915212..21149af 100644 --- a/dist/latest/light.js +++ b/dist/latest/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; f793; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 721c; v12) */ -!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,d=l.location,g=d.host,i=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,p=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://queue."+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,E=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),$=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||x($,V)||"sa",C=e.strictUtm||"true"==x($,"strict-utm"),T=B+"_loaded";if(1==l[T])return f(c+"twice");l.sa_event_loaded=!0,l[T]=!0;var F,H=function(t,e,n){t=n?t:A(M,Z,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||x($,"hostname"),z=L||g,J={version:"cdn_light_12",hostname:z};e.mode||x($,"mode");try{F=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}E&&(J.bot=!0);var M=A(J,{ua:o,https:d.protocol==n,timezone:F,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!1,w&&(M.mobile=w.mobile,M.brands=v(w.brands)),z!==g&&(M.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||L||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||x($,"referrer")||i.referrer||"").replace(g,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,K=function(e,t){var n=A(J,{type:"append",original_id:t?e:M.page_id});if(t||!m.sendBeacon)H(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){H(n,0,!0)}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:u;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);q(t)&&-1>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||x($,V)||"sa",C=e.strictUtm||"true"==x($,"strict-utm"),T=B+"_loaded";if(1==l[T])return f(c+"twice");l.sa_event_loaded=!0,l[T]=!0;var F,H=function(t,e,n){t=n?t:A(M,Z,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||x($,"hostname"),z=L||h,J={version:"cdn_light_12",hostname:z};e.mode||x($,"mode");try{F=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}E&&(J.bot=!0);var M=A(J,{ua:o,https:d.protocol==n,timezone:F,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!1,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==h&&(M.hostname_original=h),a in g&&"1"==g[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||L||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||x($,"referrer")||i.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,K=function(e,t){var n=A(J,{type:"append",original_id:t?e:M.page_id});if(t||!g.sendBeacon)H(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",u(n))}catch(r){H(n,0,!0)}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:m;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||m);H({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);q(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/app.js b/dist/v12/app.js index bbbcc3e..b2b18c1 100644 --- a/dist/v12/app.js +++ b/dist/v12/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 4e37; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; c646; SRI-version; v12) */ -!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,q="https://queue."+e,M=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[Mt];if(!ot(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[Mt];if(!ot(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n pageLoadId = undefinedVar;\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.js","sources":["app.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/app.js b/dist/v12/custom/app.js index 0632e3b..da73758 100644 --- a/dist/v12/custom/app.js +++ b/dist/v12/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 74f6; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; ddb7; SRI-version; v12) */ -!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); +!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v12/custom/app.js.map b/dist/v12/custom/app.js.map index 8a30962..583c651 100644 --- a/dist/v12/custom/app.js.map +++ b/dist/v12/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n pageLoadId = undefinedVar;\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/light.js b/dist/v12/custom/light.js index 38e4cbc..18f3a56 100644 --- a/dist/v12/custom/light.js +++ b/dist/v12/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 0f90; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 94ca; SRI-version; v12) */ -!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,d=l.location,g=d.host,i=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,p=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,x=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var $=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},I=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||A(E,V)||"sa",C=e.strictUtm||"true"==A(E,"strict-utm"),H=B+"_loaded";if(1==l[H])return f(c+"twice");l.sa_event_loaded=!0,l[H]=!0;var T,F=function(t,e,n){t=n?t:I(M,Z,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||A(E,"hostname"),z=L||g,J={version:"custom_light_12",hostname:z};e.mode||A(E,"mode");try{T=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}x&&(J.bot=!0);var M=I(J,{ua:o,https:d.protocol==n,timezone:T,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!0,w&&(M.mobile=w.mobile,M.brands=v(w.brands)),z!==g&&(M.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||L||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||A(E,"referrer")||i.referrer||"").replace(g,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,K=function(e,t){var n=I(J,{type:"append",original_id:t?e:M.page_id});if(t||!m.sendBeacon)F(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){F(n,0,!0)}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:u;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||u);F({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);$(t)&&-1"); +!function(l,e,t,f){try{var g=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,d=l.location,h=d.host,i=l.document,o=m.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,p=decodeURIComponent,u=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,x=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var $=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},I=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||A(E,V)||"sa",C=e.strictUtm||"true"==A(E,"strict-utm"),H=B+"_loaded";if(1==l[H])return f(c+"twice");l.sa_event_loaded=!0,l[H]=!0;var T,F=function(t,e,n){t=n?t:I(M,Z,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=g}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||A(E,"hostname"),z=L||h,J={version:"custom_light_12",hostname:z};e.mode||A(E,"mode");try{T=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}x&&(J.bot=!0);var M=I(J,{ua:o,https:d.protocol==n,timezone:T,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!0,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==h&&(M.hostname_original=h),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||L||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||A(E,"referrer")||i.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||g,K=function(e,t){var n=I(J,{type:"append",original_id:t?e:M.page_id});if(t||!m.sendBeacon)F(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",u(n))}catch(r){F(n,0,!0)}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:g;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||g);F({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);$(t)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v12/custom/light.js.map b/dist/v12/custom/light.js.map index e0ad431..4bb64b6 100644 --- a/dist/v12/custom/light.js.map +++ b/dist/v12/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/proxy.js b/dist/v12/custom/proxy.js index b82e51d..e4af2ca 100644 --- a/dist/v12/custom/proxy.js +++ b/dist/v12/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; ac94; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 951b; SRI-version; v12) */ -!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",I="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); +!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",I="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v12/custom/proxy.js.map b/dist/v12/custom/proxy.js.map index 151ab2b..30fd920 100644 --- a/dist/v12/custom/proxy.js.map +++ b/dist/v12/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n pageLoadId = undefinedVar;\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAhBW3B,WAgB4BR,EACvCoC,EAAkBf,EAAIe,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAASzB,EAAI0B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK5B,KAAe,WAAW4B,KAAK5B,GACxD6B,EAAStD,EAAOsD,OAIhBC,EACFhC,EAAIiC,eAAiBjC,EAAIkC,cAAc,gBAAkBvD,EAAU,MAOrEE,EAAO,WAEL,IAAIsD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK9C,EAAIV,KAAMU,EAAK4C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnChE,EAAK,iBAAmB+D,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWjG,EAAOkG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKnG,GAAkBqF,OAG5DrF,EAAmB0F,EAAO1F,EAAkBgG,GAExCE,GAAa/F,EAAK,WAAYH,GAGlC,IAAIoG,GACFpG,EAAiBoG,YAActB,EAAKxB,EAAe,gBAE7B,iBAAf8C,IACN,yEAAyEhD,KACxEgD,MAGFA,GAAahG,GAIf,IA+EIiG,GA/EAC,GAAgBrB,EAClBjF,EAAiBsG,eAAiBxB,EAAKxB,EAAe,mBAGpDiD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU7B,GAC7B,OAAO,IAAI8B,OAAO,IAAMF,GAAoBpD,KAAKwB,KAChDS,QAIHsB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe/G,EAAOgH,QAAUhH,EAAOiH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOnD,GACP,OAAO8C,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF7H,EAAiB4H,KACjB9C,EAAKxB,EAAesE,KAwyBxB,KAryBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBlI,EAAO8H,GAAY,aACpCtC,EAAS0C,KAAiBF,EAAWrC,EAAOqC,EAAUE,IAC1D,IAAIC,EAA4BnI,EAAOoI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACFhI,EACEgI,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOrC,EACLqC,EACAG,EAA0BvE,KAAK5D,EAAQ2F,EAAOqC,EAAUC,KAE1D,MAAO7D,GACPF,EAAe,WAAYE,KAU3BiE,GACFpI,EAAiBoI,WACjBtD,EAAKxB,EAAe,eAAiB9C,EAInC6H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAKhG,EACvD,IAAIiI,GAAKD,GAAmBrH,EAAIuH,QAC7B/E,MAAM,GACN4B,MAAM,KACNmB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM9F,GAAgB,EAAJoI,GAASD,EAAShF,MAAMiF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAShF,MAAM,EAAGiF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIrE,GAAasE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAY1D,OAAe9E,EAInC,IAAImG,OAAOwC,EAAO,KAAK9F,KAAKsF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKjG,EACFoI,GAAKpI,GA+BV+I,GAAiBtB,GAAY,UACjC,GAAI9H,EAAOoJ,KAAmB7I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOqJ,gBAAkB9I,EACzBP,EAAOoJ,IAAkB7I,EAOzB,IAAI+I,GAAW,SAAUrB,EAAMsB,EAAUC,GACvCvB,EAAOuB,EAAevB,EAAOtC,EAAO8D,GAASC,GAAMzB,GAE/ChH,EAAI0I,QAAUH,IAAcvB,EAAK0B,MAAQpJ,GACzCU,EAAI2I,qBAAuBJ,IAAcvB,EAAK4B,KAAOtJ,GAGzD,IAAIuJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJ7H,EACA,eACAmC,OAAO4B,KAAK6B,GACTvB,OAAO,SAAUyD,GAChB,OAAOlC,EAAKkC,IAAQ9J,IAErB4I,IAAI,SAAUkB,GACb,OACEtI,EAAuBsI,GACvB,IACAtI,EAAuBoG,EAAKkC,MAG/BjB,KAAK,KACR,SACArC,KAAKD,OAILwD,GACFnK,EAAiBoK,UAAYtF,EAAKxB,EAAe,YAC/C+G,GAAkBF,IAAuB/I,EAEzCkJ,GAAc,CAChBC,QAspBJ,kBArpBIH,SAAUC,IASZnK,EAAY,SAAUsK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJrK,EAAKqK,GACLnB,GACE3D,EAAO4E,GAAa,CAClBI,KAAM9J,EACNuD,MAAOqG,EACPG,KAAMzJ,EAAI0J,WAEZxK,EACAE,IAMJ4B,EACEtB,EACA,SAAUiK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASlC,QAAQ3I,IAC3CC,EAAU2K,EAAME,UAGpBxK,GAOF,IAwDIyK,GAxDAC,GAAQtE,KAERuE,GAAW,EAOXC,GAAOnL,EAAiBmL,MAAQrG,EAAKxB,EAAe,QAGpD8H,MA/KsBC,GA+KCrL,EAAiBoL,cA9KvBC,GA+KjBrL,EAAiBoL,WACjBtG,EAAKxB,EAAe,eAAiB9C,GACrCsE,EAAKxB,EAAe,aAAe9C,GACnCsE,EAAKxB,EAAe,gBAAkB9C,EAGtC8K,KACqC,SAAvCxG,EAAKxB,EAAe,iBACpBtD,EAAiBsL,cAAgB/K,GAI/BgL,GACFvL,EAAiBwL,UACjB1G,EAAKxB,EAAe,cACpBuE,GAAY,IAAMlH,EAGhB8K,GAAcxG,EAChBjF,EAAiByL,aAAe3G,EAAKxB,EAAe,iBAIlDyF,GAAc9D,EAChBjF,EAAiB+I,aAAejE,EAAKxB,EAAe,iBAIlDoI,GAAqBzG,EACvBjF,EAAiB0L,oBACf5G,EAAKxB,EAAe,yBAIpBqI,GACF3L,EAAiB2L,gBAAkB7G,EAAKxB,EAAe,mBAGrD6E,GACFnI,EAAiBmI,mBACjBrD,EAAKxB,EAAe,sBAItB,IAEE0H,GAAWzE,GAAsB,KAC7BqF,KAAKC,iBAAiBC,kBAAkBC,SACxC3L,EACJ,MAAO+D,IACPhE,EAAKgE,IAOP,IAAI6H,GAAUjM,EAAOiM,QACjBC,GACFjL,EAAIkL,WACJnM,EAAOoM,aACPpM,EAAOqM,aACPrM,EAAOsM,UACNL,KAAYA,GAAQM,QACrBvM,EAAOwM,YACPxM,EAAOyM,MACPrJ,GACAqE,KAAKC,UAAYD,KAAKC,SAGpBgF,GACFlG,GAAsB,MAAQA,GAAsB,QAElD0F,KAAK3B,GAAY2B,IAAM3L,GAE3B,IAAIkJ,GAAU9D,EAAO4E,GAAa,CAEhCoC,GAAInG,GAAsB,MAAQ/E,EAAYpB,EAE9CK,MAAOS,EAAIyL,UAAYlM,EACvBuK,SAAUA,GACV4B,sBAAuBtM,EACvBuM,QAASzG,KAAeqG,GAAqB5F,KAASzG,GAGtD0M,WAAYvG,GAAsB,MAC9BH,IAAcS,KACdzG,IA0BN,GAvBAoJ,GAAQuD,IAAMzM,EAIVmC,IACF+G,GAAQwD,OAASvK,EAAOuK,OACxBxD,GAAQyD,OAASjL,EAAUS,EAAOwK,SAS/B3L,EAAI4L,SAAS/M,EAAK,4CAInBkK,KAAoBjJ,IACtBoI,GAAQ2D,kBAAoB/L,IAGzBgK,IAAcrK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBkC,EAAU,SAK7B,GAAlC7B,EAAiBwH,QAAQ,OACxB,aAAaxF,KAAKhC,IACnB+I,IAEDhK,EACE,mBACEiB,EACA,SACA6B,EACA,0BAON,IACImK,GA0DAC,GA3DA5D,GAAO,GAGP6D,GAAc,WAKhB,OAFEtN,EAAiBuN,UAAYzI,EAAKxB,EAAe,aAGzBhC,EAAIiM,UAAY,IACrC1I,QAAQzD,EAAkBiJ,IAC1BxF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAASzE,GAKjCmN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKlB,GAAL,CAEA,IAAImB,EAASlI,EAAO4E,GAAa,CAC/BI,KAAM,SACNmD,YAAaF,EAAOD,EAAKlE,GAAQqD,UAenC,GAXItG,GAAsB,OACxBqH,EAAOE,SAAWtG,KAAKuG,OAAOpH,KAAQsE,GAAQuC,IAlhBnC,MAohBbA,GAAW,EACXvC,GAAQtE,KAGJJ,GAAsB,UACxBqH,EAAO1C,SAAW1D,KAAKwG,IAAI,EAAG9C,GAAU+C,OAGtCN,IAAS3M,EAAIkN,WAEf7E,GAASuE,EAAQxN,EAAcE,QAE/B,IACEU,EAAIkN,WAAWC,KAAKnN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU4L,IAC3D,MAAOQ,GAEP/E,GAASuE,EAAQxN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAI+M,QACA,KAAOvL,KAAY/C,GAAS0N,KAClCJ,GAAc1G,MACT6G,IAAY7G,KAAQ0G,IAE7B9M,GAGF2B,EAAqBY,EAAU2K,GAAalN,GAE5C,IAAI+N,GAAOhN,EAAIgN,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuBlM,EAAgBQ,IAAiB,EACxD2L,EAAShH,KAAKwG,IAChBM,GAAK3L,IAAiB,EACtB2L,GAAK1L,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO4E,KAAKiH,IACV,IAKI,EAJJjH,KAAKuG,MACF,MAAQ1L,EAAgBqM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOrK,IAEP,OADAhE,EAAKgE,IACE,IAIXjC,EAAqB,OAAQ,WAC3BgJ,GAAW+C,KACX/L,EACEM,EACA,WACM0I,GAAW+C,OAAY/C,GAAW+C,OAExC1N,KAQJ,IAiCIoO,GAuCAC,GAAUC,GAxEVC,GAAU,SAAUC,GACtB,IAAIpE,EAAO,GAIX,IACEA,EAAOoE,GAAajN,EAAuBZ,EAAI0J,UAC/C,MAAOzG,IACPhE,EAAKgE,IAGP,IAAI6K,EAAyBjP,EAAO4L,IACpC,GAAIjE,GAAWsH,GACb,IACErE,EAAOqE,EAAuBrL,KAAK5D,EAAQ,CAAE4K,KAAMA,KAAWA,EAC9D,MAAOxG,IACPF,EAAe,OAAQE,IAK3B,OA/YiB,SAAUwG,GAC3B,IAAK,IAAIhC,KAAK8C,GAAa,CACzB,IAAIwD,EAAgBxD,GAAY9C,GAChC,GAAKsG,EAAL,CAGA,IAAIC,EA1PI,KA2PND,EAAc,GAAcA,EA3PtB,IA2P8CA,EAEtD,GACEC,IAAevE,GACf,IAAIjE,OACF,IAAM/B,EAAYuK,GAAYrK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKuH,GAEP,OAAOrK,GAEX,OAAOC,EA6XH4O,CAAaxE,IACfvE,GAAahG,OACbD,EAAKuB,EAAiB,YAAciJ,KAK1B,QAARQ,IAAkBjK,EAAIkO,OAAMzE,GAAQzJ,EAAIkO,KAAK9J,MAAM,KAAK,IAErDqF,IA4CL0E,GAAW,SACbC,EACAC,EACAxH,EACAyH,IAEKA,GAAe9H,GAAWK,KAAWyH,EAAczH,GACxD,IACI0H,EAGEC,EAJFpG,EAAW5B,GAAW8H,GAAeA,EAAc,aAEnD/K,EAAS8K,KAAgD,EAA9BA,EAAc3G,QAAQ,OAGnD2G,GADIG,EAAQH,EAAcjK,MAAM,MACVqK,QACtBF,EAAc,IAAMC,EAAMzG,KAAK,MAGjC,IAAI0B,EAAOmE,GAAQS,GAGnB,GAAK5E,GAAQyC,IAAgBzC,EAA7B,CAEAyC,GAAezC,EACflB,GAAKkB,KAAOA,EAGRpE,GAAsB,OACxBkD,GAAKmG,eACHpI,KAAKwG,IAAI3L,EAA2B,aAAK,EAAGtC,EAAO8P,YAAc,IACjE,KACFpG,GAAKqG,gBACHtI,KAAKwG,IACH3L,EAAgBQ,IAAiB,EACjC9C,EAAOgQ,aAAe,IACnB,MAILxJ,GAAsB,MACpBvF,EAAIsB,KAAWmH,GAAKnH,GAAYtB,EAAIsB,IAItCe,GAAUkD,GAAsB,QAClCkD,GAAKuG,aAAe3M,EAAO4M,MAC3BxG,GAAKyG,cAAgB7M,EAAOmL,QAI9B,IAII2B,EAJAC,EAAOrQ,EAAOsQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG5F,KAC/D,MAAOvG,IACPhE,EAAKgE,IAGP0K,GAAgBsB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBvH,QAAQuH,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAG1H,QAAQwH,EAAKE,GAAgB5F,MAGxC,IAAI8F,EAA0BjD,GAC1BA,GAASjI,MA7vBH,KA6vBgB,GACtBlF,EACJwO,GAAWrB,IACgD,EAAvD7B,GAAmB9C,QAAQ4H,IAC3BA,GAA2BpP,EAC3Bb,EAGJkJ,GAAKgH,OACH,QAAQrN,KAAKkK,OAAkBgC,GAAeT,GAC1CtO,GACCqO,GAEP7G,EAAWD,GAAeC,EAAU,CAClC2C,KAAMhK,EACNiK,KAAMlB,GAAKkB,OAGb,IAAI+F,EAAsB,WACxB/O,EAA2BrB,EAC3B,IAAIqQ,EACFrB,GAAeT,KAAkBtI,GAAsB,MAhI1C,SACjB+I,EACAsB,EACAhC,EACAnG,EACAV,EACAuB,GAEIgG,GAAa7B,GAAY,GAAKjE,GAAQqD,QAASvM,GACnD,IAAIuQ,EAAuB,IAAV3N,EAAckD,GAAahG,EAC5CoJ,GAAQqD,QACNgE,IAAepE,GAAqB5F,KAASzG,GAE/C,IAAI0Q,EAAczG,GAAkByE,KAChCiC,EAAQ1I,GAAeuI,EAAkBnI,GAE7CY,GACE,CACEqE,GAAIlE,GAAQqD,QACZgB,YAAagD,EACbnG,KAAMmG,EAAa,SAAWnQ,EAC9B6M,UAAWqD,GAAoBhC,EAAWrB,GAAW,KACrDwD,MAAOA,EACP1K,EAAGA,GAEH0B,SAAU/F,EAAU+F,IAEtBuB,GAGFqF,GAAmBpB,GACnBA,GAAWuD,EAEX5N,IAgGE8N,CACE1B,EACAqB,EACA/B,GACAa,EACA1H,EACAuB,IAIJ,GAAK3H,EAmBH+O,SAjBA,IACMjO,GAAUiF,GAAWjF,EAAOwO,sBAC9BxO,EACGwO,qBAAqB,CAAClO,EAAcC,IACpCkO,KAAK,SAAUC,GACd3H,GAAQ4H,QAAUD,EAAkBpO,GACpCyG,GAAQ6H,WAAaF,EAAkBnO,GACvC0N,MAEDY,SAAMZ,GAETA,IAEF,MAAOtC,GACPsC,OAWFa,GAAMxR,EAAOyR,QACbC,GAAeF,GAAMA,GAAIG,UAAYtR,EACrCuR,GAAM5R,EAAO6R,cACbC,GAAgB,YAIhBvG,IAAemG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB7G,GAoBAmH,IAlBrB,WACL,IAEIhH,EAFAjF,EAAMhC,UACNoO,EAAKD,GAAK/N,MAAMiO,KAAMrM,GAY1B,OAVI8B,GAAWoK,OACbjH,EAAQ,IAAIiH,MAAMpH,KAIlBG,EAAQvJ,EAAI4Q,YAAY,UAClBC,UAAUzH,GAAMpK,EAASA,GAEjCuK,EAAMjH,UAAYgC,EAClB+L,GAAI9G,GACGmH,IAMX9P,EACE2P,GACA,WACExC,GAAS,IAEX9O,GAGF2B,EACE,WACA,WACEmN,GAAS,IAEX9O,IAKA+K,IAAuB,QAARH,IAAkB,iBAAkBpL,GACrDmC,EACE,aACA,WACEmN,GAAS,IAEX9O,GAIA+K,IAAa+D,KAEjBtP,EAAOqS,YAAc,SAAUzH,EAAM5C,EAAUuB,GAC7C+F,GAAS,EAAG1E,EAAM5C,EAAUuB,IAQ9B,IAAI+I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUzH,EAAO9C,EAAUyH,IACpCA,GAAe9H,GAAWK,KAAWyH,EAAczH,GAExD,IAAIwK,EAAkB7K,GAAWmD,GAC7BvB,EAAW5B,GAAW8H,GAAeA,EAAc,aACnDgD,SAAmB3H,EAEvB,GAAIwH,GAAWzJ,QAAQ4J,GAAa,IAAMD,EAExC,OADAtO,EAAesH,GAAmB5K,EAAY,aAAe6R,GACtDlJ,IAGT,IACE,GAAIiJ,EAAiB,CACnB,IAAIE,EAAc5H,IAClB,GAAIwH,GAAWzJ,eAAe6J,GAAe,EAK3C,OAJAxO,EACEsH,GACAV,EAAQ,uBAAyB4H,GAE5BnJ,IAETuB,EAAQ4H,GAEV,MAAOtO,IAEP,OADAF,EAAesH,GAAmBpH,IAC3BmF,IAGTuB,GAAS,GAAKA,GAAOhG,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAI6N,EAAc,CAAEhI,KAAM/J,EAAWkK,MAAOA,GACxC8H,GAAa9D,IAAiB3L,EAAQ,EAE1C6E,EAAWD,GAAeC,EAAU2K,GAEhC7H,GACFxB,GACE3D,EAAOgN,EAAa,CAClBhF,GAAI7G,KACJkK,MAAO1I,IAAgBsK,GACvBpF,UACGoF,GAAa/D,KAAarI,GAAsB,KAC7CoI,GACA,KAEN5G,SAAU/F,EAAU+F,KAEtBuB,IAKFsJ,GAAmB,SAAU/H,EAAO9C,EAAUuB,GAChDgJ,GAAUzH,EAAO9C,EAAUuB,IAIxBvJ,EAAOwL,MACVxL,EAAOwL,IAAqBqH,IAE9B,IAAIC,GAAY9S,EAAOwL,IAGnBuH,GAAQD,IAAaA,GAAUrK,EAAIqK,GAAUrK,EAAI,GAMrD,IAAK,IAAIqC,MAHT9K,EAAOwL,IAAqBqH,GAGVE,GACZ1O,EAAQ0O,GAAOjI,MACjB1F,MAAMC,QAAQ0N,GAAMjI,KAChByH,GAAUtO,MAAM,KAAM8O,GAAMjI,KAC5ByH,GAAUQ,GAAMjI,MAGxB,MAAOuD,IACPlO,EAAUkO,IA7IY,IAAU1D,GACxBqH,GA5nBkB1G,GA/N9B,CA0+BEtL,OACA,uBACA"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/light.js b/dist/v12/light.js index 757beff..8b82a59 100644 --- a/dist/v12/light.js +++ b/dist/v12/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; bf3a; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; cf93; SRI-version; v12) */ -!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,d=l.location,g=d.host,i=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,p=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://queue."+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,E=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),$=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||x($,V)||"sa",C=e.strictUtm||"true"==x($,"strict-utm"),T=B+"_loaded";if(1==l[T])return f(c+"twice");l.sa_event_loaded=!0,l[T]=!0;var F,H=function(t,e,n){t=n?t:A(M,Z,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||x($,"hostname"),z=L||g,J={version:"cdn_light_12",hostname:z};e.mode||x($,"mode");try{F=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}E&&(J.bot=!0);var M=A(J,{ua:o,https:d.protocol==n,timezone:F,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!0,w&&(M.mobile=w.mobile,M.brands=v(w.brands)),z!==g&&(M.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||L||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||x($,"referrer")||i.referrer||"").replace(g,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,K=function(e,t){var n=A(J,{type:"append",original_id:t?e:M.page_id});if(t||!m.sendBeacon)H(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){H(n,0,!0)}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:u;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);q(t)&&-1>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||x($,V)||"sa",C=e.strictUtm||"true"==x($,"strict-utm"),T=B+"_loaded";if(1==l[T])return f(c+"twice");l.sa_event_loaded=!0,l[T]=!0;var F,H=function(t,e,n){t=n?t:A(M,Z,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||x($,"hostname"),z=L||h,J={version:"cdn_light_12",hostname:z};e.mode||x($,"mode");try{F=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}E&&(J.bot=!0);var M=A(J,{ua:o,https:d.protocol==n,timezone:F,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!0,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==h&&(M.hostname_original=h),a in g&&"1"==g[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||L||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||x($,"referrer")||i.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,K=function(e,t){var n=A(J,{type:"append",original_id:t?e:M.page_id});if(t||!g.sendBeacon)H(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",u(n))}catch(r){H(n,0,!0)}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:m;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||m);H({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);q(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/src/default.js b/src/default.js index 8f22eb3..27f5c3b 100644 --- a/src/default.js +++ b/src/default.js @@ -767,7 +767,6 @@ /** if ignorepages **/ // Ignore pages specified in data-ignore-pages if (shouldIgnore(path)) { - pageLoadId = undefinedVar; warn(notSendingWhen + "ignoring " + path); return; } @@ -844,6 +843,13 @@ // Obfuscate personal data in URL by dropping the search and hash var path = getPath(pathOverwrite); + if (!path && pages === 0 && pageLoadId) { + // An ignored initial page must not receive event or leave enrichment. + payload.page_id = collectDataOnLeave ? uuid() : undefinedVar; + if (payload.session_id === pageLoadId) payload.session_id = uuid(); + pageLoadId = undefinedVar; + } + // Don't send the last path again (this could happen when pushState is used to change the path hash or search) if (!path || lastSendPath == path) return; diff --git a/test/unit/page-load-id.test.js b/test/unit/page-load-id.test.js index 6d41ecd..9e82189 100644 --- a/test/unit/page-load-id.test.js +++ b/test/unit/page-load-id.test.js @@ -11,6 +11,47 @@ const requests = (dom) => const wait = () => new Promise((resolve) => setTimeout(resolve, 20)); describe("server page-load ID", function () { + it("does not attribute ignored-page events or leave data to the server record", async function () { + const dom = createDOM({ + url: "https://example.com/ignore", + settings: { pageLoadId, ignorePages: "/ignore" }, + }); + dom.window.sa_event("ignored_event"); + dom.window.dispatchEvent(new dom.window.Event("pagehide")); + await wait(); + const event = requests(dom).find( + (params) => params.get("type") === "event" + ); + expect(event.get("page_id")).not.to.equal(pageLoadId); + expect(event.get("session_id")).not.to.equal(pageLoadId); + const leave = JSON.parse( + dom.sent.find(({ type }) => type === "beacon").data + ); + expect(leave.original_id).not.to.equal(pageLoadId); + dom.window.close(); + }); + + it("keeps the merge ID consistent for a manual allowed path on an ignored URL", async function () { + const dom = createDOM({ + url: "https://example.com/ignore", + settings: { pageLoadId, autoCollect: false, ignorePages: "/ignore" }, + }); + dom.window.sa_pageview("/allowed"); + dom.window.sa_event("allowed_event"); + await wait(); + const initial = requests(dom).find( + (params) => params.get("type") === "append" + ); + expect(initial.get("path")).to.equal("/allowed"); + expect(initial.get("id")).to.equal(pageLoadId); + expect(initial.get("original_id")).to.equal(pageLoadId); + const event = requests(dom).find( + (params) => params.get("type") === "event" + ); + expect(event.get("page_id")).to.equal(pageLoadId); + dom.window.close(); + }); + it("does not merge a later pageview into an ignored initial page", async function () { const dom = createDOM({ settings: { pageLoadId, autoCollect: false, ignorePages: "/ignore" }, From a823f8bc78b2417602d4f1241177366feb572c46 Mon Sep 17 00:00:00 2001 From: Simple Analytics Codex Date: Sun, 27 Sep 2026 21:47:25 +0300 Subject: [PATCH 5/9] Guard server attribution before manual pageviews --- dist/latest/cloudflare.js | 9 +++++++- dist/latest/custom/app.js | 4 ++-- dist/latest/custom/app.js.map | 2 +- dist/latest/custom/e.js | 4 ++-- dist/latest/custom/e.js.map | 2 +- dist/latest/custom/latest.dev.js | 9 +++++++- dist/latest/custom/latest.js | 4 ++-- dist/latest/custom/latest.js.map | 2 +- dist/latest/custom/light.js | 4 ++-- dist/latest/custom/light.js.map | 2 +- dist/latest/custom/proxy.js | 4 ++-- dist/latest/custom/proxy.js.map | 2 +- dist/latest/hello.js | 4 ++-- dist/latest/hello.js.map | 2 +- dist/latest/latest.dev.js | 9 +++++++- dist/latest/latest.js | 4 ++-- dist/latest/latest.js.map | 2 +- dist/latest/light.js | 4 ++-- dist/latest/light.js.map | 2 +- dist/v12/app.js | 4 ++-- dist/v12/app.js.map | 2 +- dist/v12/custom/app.js | 4 ++-- dist/v12/custom/app.js.map | 2 +- dist/v12/custom/light.js | 4 ++-- dist/v12/custom/light.js.map | 2 +- dist/v12/custom/proxy.js | 4 ++-- dist/v12/custom/proxy.js.map | 2 +- dist/v12/light.js | 4 ++-- dist/v12/light.js.map | 2 +- src/default.js | 7 +++++++ test/unit/page-load-id.test.js | 35 ++++++++++++++++++++++++++++++++ 31 files changed, 105 insertions(+), 42 deletions(-) diff --git a/dist/latest/cloudflare.js b/dist/latest/cloudflare.js index f9920a0..3b44a2d 100644 --- a/dist/latest/cloudflare.js +++ b/dist/latest/cloudflare.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 4419; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 1164; v12) */ /* eslint-env browser */ (function ( @@ -566,6 +566,7 @@ var sendOnLeave = function (id, push) { if (!collectDataOnLeave) return; + if (pageLoadId && pages === 0 && !getPath()) return; var append = assign(basePayload, { type: "append", @@ -964,6 +965,12 @@ var eventParams = { type: eventText, event: event }; var firstPage = !userNavigated && pages < 2; + // Manual collection may not have declared an allowed pageview yet. + if (pageLoadId && pages === 0 && !getPath()) { + eventParams.page_id = undefinedVar; + eventParams.session_id = undefinedVar; + } + metadata = appendMetadata(metadata, eventParams); if (event) { diff --git a/dist/latest/custom/app.js b/dist/latest/custom/app.js index 766baec..dca23f2 100644 --- a/dist/latest/custom/app.js +++ b/dist/latest/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; dc34; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; b8ce; v12) */ -!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); +!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/latest/custom/app.js.map b/dist/latest/custom/app.js.map index e324e54..b8d0c37 100644 --- a/dist/latest/custom/app.js.map +++ b/dist/latest/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && pages === 0 && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && pages === 0 && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAhBW3B,WAgB4BR,EACvCoC,EAAkBf,EAAIe,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAASzB,EAAI0B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK5B,KAAe,WAAW4B,KAAK5B,GACxD6B,EAAStD,EAAOsD,OAIhBC,EACFhC,EAAIiC,eAAiBjC,EAAIkC,cAAc,gBAAkBvD,EAAU,MAOrEE,EAAO,WAEL,IAAIsD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK9C,EAAIV,KAAMU,EAAK4C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnChE,EAAK,iBAAmB+D,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWjG,EAAOkG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKnG,GAAkBqF,OAG5DrF,EAAmB0F,EAAO1F,EAAkBgG,GAExCE,GAAa/F,EAAK,WAAYH,GAGlC,IAAIoG,GACFpG,EAAiBoG,YAActB,EAAKxB,EAAe,gBAE7B,iBAAf8C,IACN,yEAAyEhD,KACxEgD,MAGFA,GAAahG,GAIf,IA+EIiG,GA/EAC,GAAgBrB,EAClBjF,EAAiBsG,eAAiBxB,EAAKxB,EAAe,mBAGpDiD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU7B,GAC7B,OAAO,IAAI8B,OAAO,IAAMF,GAAoBpD,KAAKwB,KAChDS,QAIHsB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe/G,EAAOgH,QAAUhH,EAAOiH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOnD,GACP,OAAO8C,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF7H,EAAiB4H,KACjB9C,EAAKxB,EAAesE,KAqzBxB,KAlzBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBlI,EAAO8H,GAAY,aACpCtC,EAAS0C,KAAiBF,EAAWrC,EAAOqC,EAAUE,IAC1D,IAAIC,EAA4BnI,EAAOoI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACFhI,EACEgI,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOrC,EACLqC,EACAG,EAA0BvE,KAAK5D,EAAQ2F,EAAOqC,EAAUC,KAE1D,MAAO7D,GACPF,EAAe,WAAYE,KAU3BiE,GACFpI,EAAiBoI,WACjBtD,EAAKxB,EAAe,eAAiB9C,EAInC6H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAKhG,EACvD,IAAIiI,GAAKD,GAAmBrH,EAAIuH,QAC7B/E,MAAM,GACN4B,MAAM,KACNmB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM9F,GAAgB,EAAJoI,GAASD,EAAShF,MAAMiF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAShF,MAAM,EAAGiF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIrE,GAAasE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAY1D,OAAe9E,EAInC,IAAImG,OAAOwC,EAAO,KAAK9F,KAAKsF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKjG,EACFoI,GAAKpI,GA+BV+I,GAAiBtB,GAAY,UACjC,GAAI9H,EAAOoJ,KAAmB7I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOqJ,gBAAkB9I,EACzBP,EAAOoJ,IAAkB7I,EAOzB,IAAI+I,GAAW,SAAUrB,EAAMsB,EAAUC,GACvCvB,EAAOuB,EAAevB,EAAOtC,EAAO8D,GAASC,GAAMzB,GAE/ChH,EAAI0I,QAAUH,IAAcvB,EAAK0B,MAAQpJ,GACzCU,EAAI2I,qBAAuBJ,IAAcvB,EAAK4B,KAAOtJ,GAGzD,IAAIuJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJ7H,EACA,eACAmC,OAAO4B,KAAK6B,GACTvB,OAAO,SAAUyD,GAChB,OAAOlC,EAAKkC,IAAQ9J,IAErB4I,IAAI,SAAUkB,GACb,OACEtI,EAAuBsI,GACvB,IACAtI,EAAuBoG,EAAKkC,MAG/BjB,KAAK,KACR,SACArC,KAAKD,OAILwD,GACFnK,EAAiBoK,UAAYtF,EAAKxB,EAAe,YAC/C+G,GAAkBF,IAAuB/I,EAEzCkJ,GAAc,CAChBC,QAmqBJ,gBAlqBIH,SAAUC,IASZnK,EAAY,SAAUsK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJrK,EAAKqK,GACLnB,GACE3D,EAAO4E,GAAa,CAClBI,KAAM9J,EACNuD,MAAOqG,EACPG,KAAMzJ,EAAI0J,WAEZxK,EACAE,IAMJ4B,EACEtB,EACA,SAAUiK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASlC,QAAQ3I,IAC3CC,EAAU2K,EAAME,UAGpBxK,GAOF,IAwDIyK,GAxDAC,GAAQtE,KAERuE,GAAW,EAOXC,GAAOnL,EAAiBmL,MAAQrG,EAAKxB,EAAe,QAGpD8H,MA/KsBC,GA+KCrL,EAAiBoL,cA9KvBC,GA+KjBrL,EAAiBoL,WACjBtG,EAAKxB,EAAe,eAAiB9C,GACrCsE,EAAKxB,EAAe,aAAe9C,GACnCsE,EAAKxB,EAAe,gBAAkB9C,EAGtC8K,KACqC,SAAvCxG,EAAKxB,EAAe,iBACpBtD,EAAiBsL,cAAgB/K,GAI/BgL,GACFvL,EAAiBwL,UACjB1G,EAAKxB,EAAe,cACpBuE,GAAY,IAAMlH,EAGhB8K,GAAcxG,EAChBjF,EAAiByL,aAAe3G,EAAKxB,EAAe,iBAIlDyF,GAAc9D,EAChBjF,EAAiB+I,aAAejE,EAAKxB,EAAe,iBAIlDoI,GAAqBzG,EACvBjF,EAAiB0L,oBACf5G,EAAKxB,EAAe,yBAIpBqI,GACF3L,EAAiB2L,gBAAkB7G,EAAKxB,EAAe,mBAGrD6E,GACFnI,EAAiBmI,mBACjBrD,EAAKxB,EAAe,sBAItB,IAEE0H,GAAWzE,GAAsB,KAC7BqF,KAAKC,iBAAiBC,kBAAkBC,SACxC3L,EACJ,MAAO+D,IACPhE,EAAKgE,IAOP,IAAI6H,GAAUjM,EAAOiM,QACjBC,GACFjL,EAAIkL,WACJnM,EAAOoM,aACPpM,EAAOqM,aACPrM,EAAOsM,UACNL,KAAYA,GAAQM,QACrBvM,EAAOwM,YACPxM,EAAOyM,MACPrJ,GACAqE,KAAKC,UAAYD,KAAKC,SAGpBgF,GACFlG,GAAsB,MAAQA,GAAsB,QAElD0F,KAAK3B,GAAY2B,IAAM3L,GAE3B,IAAIkJ,GAAU9D,EAAO4E,GAAa,CAEhCoC,GAAInG,GAAsB,MAAQ/E,EAAYpB,EAE9CK,MAAOS,EAAIyL,UAAYlM,EACvBuK,SAAUA,GACV4B,sBAAuBtM,EACvBuM,QAASzG,KAAeqG,GAAqB5F,KAASzG,GAGtD0M,WAAYvG,GAAsB,MAC9BH,IAAcS,KACdzG,IA0BN,GAvBAoJ,GAAQuD,IAAMxM,EAIVkC,IACF+G,GAAQwD,OAASvK,EAAOuK,OACxBxD,GAAQyD,OAASjL,EAAUS,EAAOwK,SAS/B3L,EAAI4L,SAAS/M,EAAK,4CAInBkK,KAAoBjJ,IACtBoI,GAAQ2D,kBAAoB/L,IAGzBgK,IAAcrK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBkC,EAAU,SAK7B,GAAlC7B,EAAiBwH,QAAQ,OACxB,aAAaxF,KAAKhC,IACnB+I,IAEDhK,EACE,mBACEiB,EACA,SACA6B,EACA,0BAON,IACImK,GA2DAC,GA5DA5D,GAAO,GAGP6D,GAAc,WAKhB,OAFEtN,EAAiBuN,UAAYzI,EAAKxB,EAAe,aAGzBhC,EAAIiM,UAAY,IACrC1I,QAAQzD,EAAkBiJ,IAC1BxF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAASzE,GAKjCmN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKlB,MACDrG,IAAwB,IAAVlD,GAAgB0K,MAAlC,CAEA,IAAIC,EAASnI,EAAO4E,GAAa,CAC/BI,KAAM,SACNoD,YAAaH,EAAOD,EAAKlE,GAAQqD,UAenC,GAXItG,GAAsB,OACxBsH,EAAOE,SAAWvG,KAAKwG,OAAOrH,KAAQsE,GAAQuC,IAnhBnC,MAqhBbA,GAAW,EACXvC,GAAQtE,KAGJJ,GAAsB,UACxBsH,EAAO3C,SAAW1D,KAAKyG,IAAI,EAAG/C,GAAUgD,OAGtCP,IAAS3M,EAAImN,WAEf9E,GAASwE,EAAQzN,EAAcE,QAE/B,IACEU,EAAImN,WAAWC,KAAKpN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU6L,IAC3D,MAAOQ,GAEPhF,GAASwE,EAAQzN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAIgN,QACA,KAAOxL,KAAY/C,GAAS0N,KAClCJ,GAAc1G,MACT6G,IAAY7G,KAAQ0G,IAE7B9M,GAGF2B,EAAqBY,EAAU2K,GAAalN,GAE5C,IAAIgO,GAAOjN,EAAIiN,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuBnM,EAAgBQ,IAAiB,EACxD4L,EAASjH,KAAKyG,IAChBM,GAAK5L,IAAiB,EACtB4L,GAAK3L,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO4E,KAAKkH,IACV,IAKI,EAJJlH,KAAKwG,MACF,MAAQ3L,EAAgBsM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOtK,IAEP,OADAhE,EAAKgE,IACE,IAIXjC,EAAqB,OAAQ,WAC3BgJ,GAAWgD,KACXhM,EACEM,EACA,WACM0I,GAAWgD,OAAYhD,GAAWgD,OAExC3N,KAQJ,IAgCIqO,GAuCAC,GAAUC,GAvEVlB,GAAU,SAAUmB,GACtB,IAAIpE,EAAO,GAIX,IACEA,EAAOoE,GAAajN,EAAuBZ,EAAI0J,UAC/C,MAAOzG,IACPhE,EAAKgE,IAGP,IAAI6K,EAAyBjP,EAAO4L,IACpC,GAAIjE,GAAWsH,GACb,IACErE,EAAOqE,EAAuBrL,KAAK5D,EAAQ,CAAE4K,KAAMA,KAAWA,EAC9D,MAAOxG,IACPF,EAAe,OAAQE,IAK3B,IAhZiB,SAAUwG,GAC3B,IAAK,IAAIhC,KAAK8C,GAAa,CACzB,IAAIwD,EAAgBxD,GAAY9C,GAChC,GAAKsG,EAAL,CAGA,IAAIC,EA1PI,KA2PND,EAAc,GAAcA,EA3PtB,IA2P8CA,EAEtD,GACEC,IAAevE,GACf,IAAIjE,OACF,IAAM/B,EAAYuK,GAAYrK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKuH,GAEP,OAAOrK,GAEX,OAAOC,EA8XH4O,CAAaxE,GAQjB,MAFY,QAARQ,IAAkBjK,EAAIkO,OAAMzE,GAAQzJ,EAAIkO,KAAK9J,MAAM,KAAK,IAErDqF,EAPLxK,EAAKuB,EAAiB,YAAciJ,IAmDpC0E,GAAW,SACbC,EACAC,EACAxH,EACAyH,IAEKA,GAAe9H,GAAWK,KAAWyH,EAAczH,GACxD,IACI0H,EAGEC,EAJFpG,EAAW5B,GAAW8H,GAAeA,EAAc,aAEnD/K,EAAS8K,KAAgD,EAA9BA,EAAc3G,QAAQ,OAGnD2G,GADIG,EAAQH,EAAcjK,MAAM,MACVqK,QACtBF,EAAc,IAAMC,EAAMzG,KAAK,MAGjC,IAAI0B,EAAOiD,GAAQ2B,GAUnB,IARK5E,GAAkB,IAAVzH,GAAekD,KAE1BoD,GAAQqD,QAAUJ,GAAqB5F,KAASzG,EAC5CoJ,GAAQsD,aAAe1G,KAAYoD,GAAQsD,WAAajG,MAC5DT,GAAahG,GAIVuK,GAAQyC,IAAgBzC,EAA7B,CAEAyC,GAAezC,EACflB,GAAKkB,KAAOA,EAGRpE,GAAsB,OACxBkD,GAAKmG,eACHpI,KAAKyG,IAAI5L,EAA2B,aAAK,EAAGtC,EAAO8P,YAAc,IACjE,KACFpG,GAAKqG,gBACHtI,KAAKyG,IACH5L,EAAgBQ,IAAiB,EACjC9C,EAAOgQ,aAAe,IACnB,MAILxJ,GAAsB,MACpBvF,EAAIsB,KAAWmH,GAAKnH,GAAYtB,EAAIsB,IAItCe,GAAUkD,GAAsB,QAClCkD,GAAKuG,aAAe3M,EAAO4M,MAC3BxG,GAAKyG,cAAgB7M,EAAOoL,QAI9B,IAII0B,EAJAC,EAAOrQ,EAAOsQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG5F,KAC/D,MAAOvG,IACPhE,EAAKgE,IAGP2K,GAAgBqB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBvH,QAAQuH,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAG1H,QAAQwH,EAAKE,GAAgB5F,MAGxC,IAAI8F,EAA0BjD,GAC1BA,GAASjI,MApwBH,KAowBgB,GACtBlF,EACJyO,GAAWtB,IACgD,EAAvD7B,GAAmB9C,QAAQ4H,IAC3BA,GAA2BpP,EAC3Bb,EAGJkJ,GAAKgH,OACH,QAAQrN,KAAKkK,OAAkBgC,GAAeR,GAC1CvO,GACCsO,GAEP9G,EAAWD,GAAeC,EAAU,CAClC2C,KAAMhK,EACNiK,KAAMlB,GAAKkB,OAGb,IAAI+F,EAAsB,WACxB/O,EAA2BrB,EAC3B,IAAIqQ,EACFrB,GAAeR,KAAkBvI,GAAsB,MAvI1C,SACjB+I,EACAsB,EACA/B,EACApG,EACAV,EACAuB,GAEIgG,GAAa7B,GAAY,GAAKjE,GAAQqD,QAASvM,GACnD,IAAIuQ,EAAuB,IAAV3N,EAAckD,GAAahG,EAC5CoJ,GAAQqD,QACNgE,IAAepE,GAAqB5F,KAASzG,GAE/C,IAAI0Q,EAAczG,GAAkBuD,KAChCmD,EAAQ1I,GAAeuI,EAAkBnI,GAE7CY,GACE,CACEqE,GAAIlE,GAAQqD,QACZiB,YAAa+C,EACbnG,KAAMmG,EAAa,SAAWnQ,EAC9B6M,UAAWqD,GAAoB/B,EAAWtB,GAAW,KACrDwD,MAAOA,EACP1K,EAAGA,GAEH0B,SAAU/F,EAAU+F,IAEtBuB,GAGFsF,GAAmBrB,GACnBA,GAAWuD,EAEX5N,IAuGE8N,CACE1B,EACAqB,EACA9B,GACAY,EACA1H,EACAuB,IAIJ,GAAK3H,EAmBH+O,SAjBA,IACMjO,GAAUiF,GAAWjF,EAAOwO,sBAC9BxO,EACGwO,qBAAqB,CAAClO,EAAcC,IACpCkO,KAAK,SAAUC,GACd3H,GAAQ4H,QAAUD,EAAkBpO,GACpCyG,GAAQ6H,WAAaF,EAAkBnO,GACvC0N,MAEDY,SAAMZ,GAETA,IAEF,MAAOrC,GACPqC,OAWFa,GAAMxR,EAAOyR,QACbC,GAAeF,GAAMA,GAAIG,UAAYtR,EACrCuR,GAAM5R,EAAO6R,cACbC,GAAgB,YAIhBvG,IAAemG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB7G,GAoBAmH,IAlBrB,WACL,IAEIhH,EAFAjF,EAAMhC,UACNoO,EAAKD,GAAK/N,MAAMiO,KAAMrM,GAY1B,OAVI8B,GAAWoK,OACbjH,EAAQ,IAAIiH,MAAMpH,KAIlBG,EAAQvJ,EAAI4Q,YAAY,UAClBC,UAAUzH,GAAMpK,EAASA,GAEjCuK,EAAMjH,UAAYgC,EAClB+L,GAAI9G,GACGmH,IAMX9P,EACE2P,GACA,WACExC,GAAS,IAEX9O,GAGF2B,EACE,WACA,WACEmN,GAAS,IAEX9O,IAKA+K,IAAuB,QAARH,IAAkB,iBAAkBpL,GACrDmC,EACE,aACA,WACEmN,GAAS,IAEX9O,GAIA+K,IAAa+D,KAEjBtP,EAAOqS,YAAc,SAAUzH,EAAM5C,EAAUuB,GAC7C+F,GAAS,EAAG1E,EAAM5C,EAAUuB,IAQ9B,IAAI+I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUzH,EAAO9C,EAAUyH,IACpCA,GAAe9H,GAAWK,KAAWyH,EAAczH,GAExD,IAAIwK,EAAkB7K,GAAWmD,GAC7BvB,EAAW5B,GAAW8H,GAAeA,EAAc,aACnDgD,SAAmB3H,EAEvB,GAAIwH,GAAWzJ,QAAQ4J,GAAa,IAAMD,EAExC,OADAtO,EAAesH,GAAmB5K,EAAY,aAAe6R,GACtDlJ,IAGT,IACE,GAAIiJ,EAAiB,CACnB,IAAIE,EAAc5H,IAClB,GAAIwH,GAAWzJ,eAAe6J,GAAe,EAK3C,OAJAxO,EACEsH,GACAV,EAAQ,uBAAyB4H,GAE5BnJ,IAETuB,EAAQ4H,GAEV,MAAOtO,IAEP,OADAF,EAAesH,GAAmBpH,IAC3BmF,IAGTuB,GAAS,GAAKA,GAAOhG,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAI6N,EAAc,CAAEhI,KAAM/J,EAAWkK,MAAOA,GACxC8H,GAAa7D,IAAiB5L,EAAQ,EAGtCkD,IAAwB,IAAVlD,IAAgB0K,OAChC8E,EAAY7F,QAAUzM,EACtBsS,EAAY5F,WAAa1M,GAG3B2H,EAAWD,GAAeC,EAAU2K,GAEhC7H,GACFxB,GACE3D,EAAOgN,EAAa,CAClBhF,GAAI7G,KACJkK,MAAO1I,IAAgBsK,GACvBpF,UACGoF,GAAa9D,KAAatI,GAAsB,KAC7CqI,GACA,KAEN7G,SAAU/F,EAAU+F,KAEtBuB,IAKFsJ,GAAmB,SAAU/H,EAAO9C,EAAUuB,GAChDgJ,GAAUzH,EAAO9C,EAAUuB,IAIxBvJ,EAAOwL,MACVxL,EAAOwL,IAAqBqH,IAE9B,IAAIC,GAAY9S,EAAOwL,IAGnBuH,GAAQD,IAAaA,GAAUrK,EAAIqK,GAAUrK,EAAI,GAMrD,IAAK,IAAIqC,MAHT9K,EAAOwL,IAAqBqH,GAGVE,GACZ1O,EAAQ0O,GAAOjI,MACjB1F,MAAMC,QAAQ0N,GAAMjI,KAChByH,GAAUtO,MAAM,KAAM8O,GAAMjI,KAC5ByH,GAAUQ,GAAMjI,MAGxB,MAAOwD,IACPnO,EAAUmO,IAnJY,IAAU3D,GACxBqH,GAnoBkB1G,GA/N9B,CAu/BEtL,OACA,uBACA"} \ No newline at end of file diff --git a/dist/latest/custom/e.js b/dist/latest/custom/e.js index fb33111..6704c31 100644 --- a/dist/latest/custom/e.js +++ b/dist/latest/custom/e.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; b467; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; a5e7; v12) */ -!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); +!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); //# sourceMappingURL=e.js.map \ No newline at end of file diff --git a/dist/latest/custom/e.js.map b/dist/latest/custom/e.js.map index 7cddf80..68f1247 100644 --- a/dist/latest/custom/e.js.map +++ b/dist/latest/custom/e.js.map @@ -1 +1 @@ -{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && pages === 0 && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && pages === 0 && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/latest.dev.js b/dist/latest/custom/latest.dev.js index 07ed5f6..cd112b4 100644 --- a/dist/latest/custom/latest.dev.js +++ b/dist/latest/custom/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 7846; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; df4b; v12) */ /* eslint-env browser */ (function ( @@ -566,6 +566,7 @@ var sendOnLeave = function (id, push) { if (!collectDataOnLeave) return; + if (pageLoadId && pages === 0 && !getPath()) return; var append = assign(basePayload, { type: "append", @@ -964,6 +965,12 @@ var eventParams = { type: eventText, event: event }; var firstPage = !userNavigated && pages < 2; + // Manual collection may not have declared an allowed pageview yet. + if (pageLoadId && pages === 0 && !getPath()) { + eventParams.page_id = undefinedVar; + eventParams.session_id = undefinedVar; + } + metadata = appendMetadata(metadata, eventParams); if (event) { diff --git a/dist/latest/custom/latest.js b/dist/latest/custom/latest.js index d05907a..038d9fb 100644 --- a/dist/latest/custom/latest.js +++ b/dist/latest/custom/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 6983; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 3c36; v12) */ -!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); +!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); //# sourceMappingURL=latest.js.map \ No newline at end of file diff --git a/dist/latest/custom/latest.js.map b/dist/latest/custom/latest.js.map index a6080df..bec680c 100644 --- a/dist/latest/custom/latest.js.map +++ b/dist/latest/custom/latest.js.map @@ -1 +1 @@ -{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && pages === 0 && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && pages === 0 && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/light.js b/dist/latest/custom/light.js index 2f6868d..16c43ad 100644 --- a/dist/latest/custom/light.js +++ b/dist/latest/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 130e; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; cbbc; v12) */ -!function(l,e,t,f){try{var g=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,d=l.location,h=d.host,i=l.document,o=m.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,p=decodeURIComponent,u=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,x=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var $=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},I=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||A(E,V)||"sa",C=e.strictUtm||"true"==A(E,"strict-utm"),H=B+"_loaded";if(1==l[H])return f(c+"twice");l.sa_event_loaded=!0,l[H]=!0;var T,F=function(t,e,n){t=n?t:I(M,Z,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=g}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||A(E,"hostname"),z=L||h,J={version:"custom_light_12",hostname:z};e.mode||A(E,"mode");try{T=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}x&&(J.bot=!0);var M=I(J,{ua:o,https:d.protocol==n,timezone:T,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!1,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==h&&(M.hostname_original=h),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||L||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||A(E,"referrer")||i.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||g,K=function(e,t){var n=I(J,{type:"append",original_id:t?e:M.page_id});if(t||!m.sendBeacon)F(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",u(n))}catch(r){F(n,0,!0)}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:g;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||g);F({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);$(t)&&-1"); +!function(l,e,t,f){try{var g=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,d=l.location,h=d.host,i=l.document,o=m.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,p=decodeURIComponent,u=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,x=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var $=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},I=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||A(E,V)||"sa",C=e.strictUtm||"true"==A(E,"strict-utm"),H=B+"_loaded";if(1==l[H])return f(c+"twice");l.sa_event_loaded=!0,l[H]=!0;var T,F=function(t,e,n){t=n?t:I(M,Z,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=g}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||A(E,"hostname"),z=L||h,J={version:"custom_light_12",hostname:z};e.mode||A(E,"mode");try{T=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}x&&(J.bot=!0);var M=I(J,{ua:o,https:d.protocol==n,timezone:T,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!1,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==h&&(M.hostname_original=h),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||L||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||A(E,"referrer")||i.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||g,K=function(e,t){if(0,!N||0!==k||X()){var n=I(J,{type:"append",original_id:t?e:M.page_id});if(t||!m.sendBeacon)F(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",u(n))}catch(r){F(n,0,!0)}}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:g;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||g);F({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);$(t)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/latest/custom/light.js.map b/dist/latest/custom/light.js.map index b1329f5..b4d6c35 100644 --- a/dist/latest/custom/light.js.map +++ b/dist/latest/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && pages === 0 && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/proxy.js b/dist/latest/custom/proxy.js index ccbf0a7..0c0c53f 100644 --- a/dist/latest/custom/proxy.js +++ b/dist/latest/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 7ea1; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; a078; v12) */ -!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",I="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); +!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",I="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/latest/custom/proxy.js.map b/dist/latest/custom/proxy.js.map index 39958fe..2d1a3fa 100644 --- a/dist/latest/custom/proxy.js.map +++ b/dist/latest/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && pages === 0 && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && pages === 0 && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/hello.js b/dist/latest/hello.js index 0c0aac5..4740027 100644 --- a/dist/latest/hello.js +++ b/dist/latest/hello.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; f3be) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; f8e7) */ -!function(h,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,q="https://queue."+e,M=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[Mt];if(!ot(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},oe=function(e){return"function"==typeof e},ce="namespace",se=e[ce]||J(z,ce)||"sa",ue=function(e,t){var n=h[se+"_metadata"];Z(n)&&(e=K(e,n));var r=h[Me];if(!oe(r))return Me&&m(Me+" not found, set window."+Me),e;try{return K(e,r.call(h,K(e,t)))}catch(a){F("metadata",a)}},le=e.strictUtm||J(z,"strict-utm")==r,pe=function(i,e){te=!i&&re("q")?"":y;var t=(e||s.search).slice(1).split("&").filter(function(e){var t=e.indexOf("=");te!==y&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"hello.source.js","sources":["hello.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && pages === 0 && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && pages === 0 && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/latest.dev.js b/dist/latest/latest.dev.js index 78d8f56..8491042 100644 --- a/dist/latest/latest.dev.js +++ b/dist/latest/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; f72b; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 9573; v12) */ /* eslint-env browser */ (function ( @@ -566,6 +566,7 @@ var sendOnLeave = function (id, push) { if (!collectDataOnLeave) return; + if (pageLoadId && pages === 0 && !getPath()) return; var append = assign(basePayload, { type: "append", @@ -964,6 +965,12 @@ var eventParams = { type: eventText, event: event }; var firstPage = !userNavigated && pages < 2; + // Manual collection may not have declared an allowed pageview yet. + if (pageLoadId && pages === 0 && !getPath()) { + eventParams.page_id = undefinedVar; + eventParams.session_id = undefinedVar; + } + metadata = appendMetadata(metadata, eventParams); if (event) { diff --git a/dist/latest/latest.js b/dist/latest/latest.js index f91a5c8..d6c96fa 100644 --- a/dist/latest/latest.js +++ b/dist/latest/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 23a4; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 60e7; v12) */ -!function(h,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,q="https://queue."+e,M=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[Mt];if(!ot(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[Mt];if(!ot(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && pages === 0 && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && pages === 0 && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/light.js b/dist/latest/light.js index 21149af..c753bb3 100644 --- a/dist/latest/light.js +++ b/dist/latest/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 721c; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 278c; v12) */ -!function(l,e,t,f){try{var m=undefined,n="https:",r=l.console,a="doNotTrack",g=l.navigator,d=l.location,h=d.host,i=l.document,o=g.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,p=decodeURIComponent,u=JSON.stringify,y=l.addEventListener,_="https://queue."+t,b=(i.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,E=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),$=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||x($,V)||"sa",C=e.strictUtm||"true"==x($,"strict-utm"),T=B+"_loaded";if(1==l[T])return f(c+"twice");l.sa_event_loaded=!0,l[T]=!0;var F,H=function(t,e,n){t=n?t:A(M,Z,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||x($,"hostname"),z=L||h,J={version:"cdn_light_12",hostname:z};e.mode||x($,"mode");try{F=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}E&&(J.bot=!0);var M=A(J,{ua:o,https:d.protocol==n,timezone:F,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!1,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==h&&(M.hostname_original=h),a in g&&"1"==g[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||L||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||x($,"referrer")||i.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,K=function(e,t){var n=A(J,{type:"append",original_id:t?e:M.page_id});if(t||!g.sendBeacon)H(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",u(n))}catch(r){H(n,0,!0)}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:m;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||m);H({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);q(t)&&-1>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||x($,V)||"sa",C=e.strictUtm||"true"==x($,"strict-utm"),T=B+"_loaded";if(1==l[T])return f(c+"twice");l.sa_event_loaded=!0,l[T]=!0;var F,H=function(t,e,n){t=n?t:A(M,Z,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||x($,"hostname"),z=L||h,J={version:"cdn_light_12",hostname:z};e.mode||x($,"mode");try{F=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}E&&(J.bot=!0);var M=A(J,{ua:o,https:d.protocol==n,timezone:F,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!1,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==h&&(M.hostname_original=h),a in g&&"1"==g[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||L||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||x($,"referrer")||i.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,K=function(e,t){if(0,!N||0!==k||X()){var n=A(J,{type:"append",original_id:t?e:M.page_id});if(t||!g.sendBeacon)H(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",u(n))}catch(r){H(n,0,!0)}}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:m;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||m);H({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);q(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && pages === 0 && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/app.js b/dist/v12/app.js index b2b18c1..afa3244 100644 --- a/dist/v12/app.js +++ b/dist/v12/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; c646; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 32f0; SRI-version; v12) */ -!function(h,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,q="https://queue."+e,M=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[Mt];if(!ot(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[Mt];if(!ot(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.js","sources":["app.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && pages === 0 && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && pages === 0 && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/app.js b/dist/v12/custom/app.js index da73758..ffac005 100644 --- a/dist/v12/custom/app.js +++ b/dist/v12/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; ddb7; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 5e3e; SRI-version; v12) */ -!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); +!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v12/custom/app.js.map b/dist/v12/custom/app.js.map index 583c651..b8806ec 100644 --- a/dist/v12/custom/app.js.map +++ b/dist/v12/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && pages === 0 && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && pages === 0 && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/light.js b/dist/v12/custom/light.js index 18f3a56..ce1800f 100644 --- a/dist/v12/custom/light.js +++ b/dist/v12/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 94ca; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 3bd9; SRI-version; v12) */ -!function(l,e,t,f){try{var g=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,d=l.location,h=d.host,i=l.document,o=m.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,p=decodeURIComponent,u=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,x=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var $=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},I=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||A(E,V)||"sa",C=e.strictUtm||"true"==A(E,"strict-utm"),H=B+"_loaded";if(1==l[H])return f(c+"twice");l.sa_event_loaded=!0,l[H]=!0;var T,F=function(t,e,n){t=n?t:I(M,Z,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=g}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||A(E,"hostname"),z=L||h,J={version:"custom_light_12",hostname:z};e.mode||A(E,"mode");try{T=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}x&&(J.bot=!0);var M=I(J,{ua:o,https:d.protocol==n,timezone:T,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!0,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==h&&(M.hostname_original=h),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||L||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||A(E,"referrer")||i.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||g,K=function(e,t){var n=I(J,{type:"append",original_id:t?e:M.page_id});if(t||!m.sendBeacon)F(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",u(n))}catch(r){F(n,0,!0)}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:g;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||g);F({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);$(t)&&-1"); +!function(l,e,t,f){try{var g=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,d=l.location,h=d.host,i=l.document,o=m.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,p=decodeURIComponent,u=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,x=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var $=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},I=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||A(E,V)||"sa",C=e.strictUtm||"true"==A(E,"strict-utm"),H=B+"_loaded";if(1==l[H])return f(c+"twice");l.sa_event_loaded=!0,l[H]=!0;var T,F=function(t,e,n){t=n?t:I(M,Z,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=g}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||A(E,"hostname"),z=L||h,J={version:"custom_light_12",hostname:z};e.mode||A(E,"mode");try{T=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}x&&(J.bot=!0);var M=I(J,{ua:o,https:d.protocol==n,timezone:T,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!0,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==h&&(M.hostname_original=h),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||L||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||A(E,"referrer")||i.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||g,K=function(e,t){if(0,!N||0!==k||X()){var n=I(J,{type:"append",original_id:t?e:M.page_id});if(t||!m.sendBeacon)F(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",u(n))}catch(r){F(n,0,!0)}}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:g;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||g);F({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);$(t)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v12/custom/light.js.map b/dist/v12/custom/light.js.map index 4bb64b6..ee76413 100644 --- a/dist/v12/custom/light.js.map +++ b/dist/v12/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && pages === 0 && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/proxy.js b/dist/v12/custom/proxy.js index e4af2ca..fcbe018 100644 --- a/dist/v12/custom/proxy.js +++ b/dist/v12/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 951b; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 44e5; SRI-version; v12) */ -!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",I="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); +!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",I="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v12/custom/proxy.js.map b/dist/v12/custom/proxy.js.map index 30fd920..f774fa0 100644 --- a/dist/v12/custom/proxy.js.map +++ b/dist/v12/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && pages === 0 && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && pages === 0 && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/light.js b/dist/v12/light.js index 8b82a59..5cb9e2f 100644 --- a/dist/v12/light.js +++ b/dist/v12/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; cf93; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 31aa; SRI-version; v12) */ -!function(l,e,t,f){try{var m=undefined,n="https:",r=l.console,a="doNotTrack",g=l.navigator,d=l.location,h=d.host,i=l.document,o=g.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,p=decodeURIComponent,u=JSON.stringify,y=l.addEventListener,_="https://queue."+t,b=(i.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,E=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),$=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||x($,V)||"sa",C=e.strictUtm||"true"==x($,"strict-utm"),T=B+"_loaded";if(1==l[T])return f(c+"twice");l.sa_event_loaded=!0,l[T]=!0;var F,H=function(t,e,n){t=n?t:A(M,Z,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||x($,"hostname"),z=L||h,J={version:"cdn_light_12",hostname:z};e.mode||x($,"mode");try{F=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}E&&(J.bot=!0);var M=A(J,{ua:o,https:d.protocol==n,timezone:F,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!0,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==h&&(M.hostname_original=h),a in g&&"1"==g[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||L||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||x($,"referrer")||i.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,K=function(e,t){var n=A(J,{type:"append",original_id:t?e:M.page_id});if(t||!g.sendBeacon)H(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",u(n))}catch(r){H(n,0,!0)}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:m;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||m);H({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);q(t)&&-1>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||x($,V)||"sa",C=e.strictUtm||"true"==x($,"strict-utm"),T=B+"_loaded";if(1==l[T])return f(c+"twice");l.sa_event_loaded=!0,l[T]=!0;var F,H=function(t,e,n){t=n?t:A(M,Z,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||x($,"hostname"),z=L||h,J={version:"cdn_light_12",hostname:z};e.mode||x($,"mode");try{F=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}E&&(J.bot=!0);var M=A(J,{ua:o,https:d.protocol==n,timezone:F,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!0,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==h&&(M.hostname_original=h),a in g&&"1"==g[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||L||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||x($,"referrer")||i.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,K=function(e,t){if(0,!N||0!==k||X()){var n=A(J,{type:"append",original_id:t?e:M.page_id});if(t||!g.sendBeacon)H(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",u(n))}catch(r){H(n,0,!0)}}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:m;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||m);H({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);q(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && pages === 0 && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/src/default.js b/src/default.js index 27f5c3b..716848e 100644 --- a/src/default.js +++ b/src/default.js @@ -649,6 +649,7 @@ var sendOnLeave = function (id, push) { if (!collectDataOnLeave) return; + if (pageLoadId && pages === 0 && !getPath()) return; var append = assign(basePayload, { type: "append", @@ -1094,6 +1095,12 @@ var eventParams = { type: eventText, event: event }; var firstPage = !userNavigated && pages < 2; + // Manual collection may not have declared an allowed pageview yet. + if (pageLoadId && pages === 0 && !getPath()) { + eventParams.page_id = undefinedVar; + eventParams.session_id = undefinedVar; + } + /** if metadata **/ metadata = appendMetadata(metadata, eventParams); /** endif **/ diff --git a/test/unit/page-load-id.test.js b/test/unit/page-load-id.test.js index 9e82189..086814a 100644 --- a/test/unit/page-load-id.test.js +++ b/test/unit/page-load-id.test.js @@ -11,6 +11,41 @@ const requests = (dom) => const wait = () => new Promise((resolve) => setTimeout(resolve, 20)); describe("server page-load ID", function () { + it("withholds ignored-URL attribution until a manual allowed pageview is declared", async function () { + const dom = createDOM({ + url: "https://example.com/ignore", + settings: { pageLoadId, autoCollect: false, ignorePages: "/ignore" }, + }); + dom.window.sa_event("before_pageview"); + dom.window.dispatchEvent(new dom.window.Event("pagehide")); + await wait(); + const before = requests(dom).find( + (params) => params.get("event") === "before_pageview" + ); + expect(before.get("page_id")).not.to.equal(pageLoadId); + expect(before.get("session_id")).not.to.equal(pageLoadId); + expect(dom.sent.filter(({ type }) => type === "beacon")).to.be.empty; + + dom.window.sa_pageview("/allowed"); + dom.window.sa_event("after_pageview"); + dom.window.dispatchEvent(new dom.window.Event("pagehide")); + await wait(); + const initial = requests(dom).find( + (params) => params.get("type") === "append" + ); + expect(initial.get("original_id")).to.equal(pageLoadId); + const after = requests(dom).find( + (params) => params.get("event") === "after_pageview" + ); + expect(after.get("page_id")).to.equal(pageLoadId); + expect(after.get("session_id")).to.equal(pageLoadId); + const leave = JSON.parse( + dom.sent.find(({ type }) => type === "beacon").data + ); + expect(leave.original_id).to.equal(pageLoadId); + dom.window.close(); + }); + it("does not attribute ignored-page events or leave data to the server record", async function () { const dom = createDOM({ url: "https://example.com/ignore", From 9ba07bbd8915ad1508472be45b278b697f12ca98 Mon Sep 17 00:00:00 2001 From: Simple Analytics Codex Date: Sun, 27 Sep 2026 21:56:06 +0300 Subject: [PATCH 6/9] Keep accepted page-load attribution during client hints collection --- dist/latest/cloudflare.js | 8 +++--- dist/latest/custom/app.js | 4 +-- dist/latest/custom/app.js.map | 2 +- dist/latest/custom/e.js | 4 +-- dist/latest/custom/e.js.map | 2 +- dist/latest/custom/latest.dev.js | 8 +++--- dist/latest/custom/latest.js | 4 +-- dist/latest/custom/latest.js.map | 2 +- dist/latest/custom/light.js | 4 +-- dist/latest/custom/light.js.map | 2 +- dist/latest/custom/proxy.js | 4 +-- dist/latest/custom/proxy.js.map | 2 +- dist/latest/hello.js | 4 +-- dist/latest/hello.js.map | 2 +- dist/latest/latest.dev.js | 8 +++--- dist/latest/latest.js | 4 +-- dist/latest/latest.js.map | 2 +- dist/latest/light.js | 4 +-- dist/latest/light.js.map | 2 +- dist/v12/app.js | 4 +-- dist/v12/app.js.map | 2 +- dist/v12/custom/app.js | 4 +-- dist/v12/custom/app.js.map | 2 +- dist/v12/custom/light.js | 4 +-- dist/v12/custom/light.js.map | 2 +- dist/v12/custom/proxy.js | 4 +-- dist/v12/custom/proxy.js.map | 2 +- dist/v12/light.js | 4 +-- dist/v12/light.js.map | 2 +- src/default.js | 6 ++-- test/unit/page-load-id.test.js | 49 ++++++++++++++++++++++++++++++++ 31 files changed, 103 insertions(+), 54 deletions(-) diff --git a/dist/latest/cloudflare.js b/dist/latest/cloudflare.js index 3b44a2d..be57aef 100644 --- a/dist/latest/cloudflare.js +++ b/dist/latest/cloudflare.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 1164; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 57bf; v12) */ /* eslint-env browser */ (function ( @@ -566,7 +566,7 @@ var sendOnLeave = function (id, push) { if (!collectDataOnLeave) return; - if (pageLoadId && pages === 0 && !getPath()) return; + if (pageLoadId && !lastSendPath && !getPath()) return; var append = assign(basePayload, { type: "append", @@ -743,7 +743,7 @@ // Obfuscate personal data in URL by dropping the search and hash var path = getPath(pathOverwrite); - if (!path && pages === 0 && pageLoadId) { + if (!path && !lastSendPath && pageLoadId) { // An ignored initial page must not receive event or leave enrichment. payload.page_id = collectDataOnLeave ? uuid() : undefinedVar; if (payload.session_id === pageLoadId) payload.session_id = uuid(); @@ -966,7 +966,7 @@ var firstPage = !userNavigated && pages < 2; // Manual collection may not have declared an allowed pageview yet. - if (pageLoadId && pages === 0 && !getPath()) { + if (pageLoadId && !lastSendPath && !getPath()) { eventParams.page_id = undefinedVar; eventParams.session_id = undefinedVar; } diff --git a/dist/latest/custom/app.js b/dist/latest/custom/app.js index dca23f2..cbbb6da 100644 --- a/dist/latest/custom/app.js +++ b/dist/latest/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; b8ce; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 8935; v12) */ -!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); +!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/latest/custom/app.js.map b/dist/latest/custom/app.js.map index b8d0c37..2041ae6 100644 --- a/dist/latest/custom/app.js.map +++ b/dist/latest/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && pages === 0 && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && pages === 0 && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/e.js b/dist/latest/custom/e.js index 6704c31..a9bbf97 100644 --- a/dist/latest/custom/e.js +++ b/dist/latest/custom/e.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; a5e7; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; f435; v12) */ -!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); +!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); //# sourceMappingURL=e.js.map \ No newline at end of file diff --git a/dist/latest/custom/e.js.map b/dist/latest/custom/e.js.map index 68f1247..b650578 100644 --- a/dist/latest/custom/e.js.map +++ b/dist/latest/custom/e.js.map @@ -1 +1 @@ -{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && pages === 0 && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && pages === 0 && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAhBW3B,WAgB4BR,EACvCoC,EAAkBf,EAAIe,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAASzB,EAAI0B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK5B,KAAe,WAAW4B,KAAK5B,GACxD6B,EAAStD,EAAOsD,OAIhBC,EACFhC,EAAIiC,eAAiBjC,EAAIkC,cAAc,gBAAkBvD,EAAU,MAOrEE,EAAO,WAEL,IAAIsD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK9C,EAAIV,KAAMU,EAAK4C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnChE,EAAK,iBAAmB+D,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWjG,EAAOkG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKnG,GAAkBqF,OAG5DrF,EAAmB0F,EAAO1F,EAAkBgG,GAExCE,GAAa/F,EAAK,WAAYH,GAGlC,IAAIoG,GACFpG,EAAiBoG,YAActB,EAAKxB,EAAe,gBAE7B,iBAAf8C,IACN,yEAAyEhD,KACxEgD,MAGFA,GAAahG,GAIf,IA+EIiG,GA/EAC,GAAgBrB,EAClBjF,EAAiBsG,eAAiBxB,EAAKxB,EAAe,mBAGpDiD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU7B,GAC7B,OAAO,IAAI8B,OAAO,IAAMF,GAAoBpD,KAAKwB,KAChDS,QAIHsB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe/G,EAAOgH,QAAUhH,EAAOiH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOnD,GACP,OAAO8C,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF7H,EAAiB4H,KACjB9C,EAAKxB,EAAesE,KAqzBxB,KAlzBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBlI,EAAO8H,GAAY,aACpCtC,EAAS0C,KAAiBF,EAAWrC,EAAOqC,EAAUE,IAC1D,IAAIC,EAA4BnI,EAAOoI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACFhI,EACEgI,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOrC,EACLqC,EACAG,EAA0BvE,KAAK5D,EAAQ2F,EAAOqC,EAAUC,KAE1D,MAAO7D,GACPF,EAAe,WAAYE,KAU3BiE,GACFpI,EAAiBoI,WACjBtD,EAAKxB,EAAe,eAAiB9C,EAInC6H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAKhG,EACvD,IAAIiI,GAAKD,GAAmBrH,EAAIuH,QAC7B/E,MAAM,GACN4B,MAAM,KACNmB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM9F,GAAgB,EAAJoI,GAASD,EAAShF,MAAMiF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAShF,MAAM,EAAGiF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIrE,GAAasE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAY1D,OAAe9E,EAInC,IAAImG,OAAOwC,EAAO,KAAK9F,KAAKsF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKjG,EACFoI,GAAKpI,GA+BV+I,GAAiBtB,GAAY,UACjC,GAAI9H,EAAOoJ,KAAmB7I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOqJ,gBAAkB9I,EACzBP,EAAOoJ,IAAkB7I,EAOzB,IAAI+I,GAAW,SAAUrB,EAAMsB,EAAUC,GACvCvB,EAAOuB,EAAevB,EAAOtC,EAAO8D,GAASC,GAAMzB,GAE/ChH,EAAI0I,QAAUH,IAAcvB,EAAK0B,MAAQpJ,GACzCU,EAAI2I,qBAAuBJ,IAAcvB,EAAK4B,KAAOtJ,GAGzD,IAAIuJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJ7H,EACA,eACAmC,OAAO4B,KAAK6B,GACTvB,OAAO,SAAUyD,GAChB,OAAOlC,EAAKkC,IAAQ9J,IAErB4I,IAAI,SAAUkB,GACb,OACEtI,EAAuBsI,GACvB,IACAtI,EAAuBoG,EAAKkC,MAG/BjB,KAAK,KACR,SACArC,KAAKD,OAILwD,GACFnK,EAAiBoK,UAAYtF,EAAKxB,EAAe,YAC/C+G,GAAkBF,IAAuB/I,EAEzCkJ,GAAc,CAChBC,QAmqBJ,mBAlqBIH,SAAUC,IASZnK,EAAY,SAAUsK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJrK,EAAKqK,GACLnB,GACE3D,EAAO4E,GAAa,CAClBI,KAAM9J,EACNuD,MAAOqG,EACPG,KAAMzJ,EAAI0J,WAEZxK,EACAE,IAMJ4B,EACEtB,EACA,SAAUiK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASlC,QAAQ3I,IAC3CC,EAAU2K,EAAME,UAGpBxK,GAOF,IAwDIyK,GAxDAC,GAAQtE,KAERuE,GAAW,EAOXC,GAAOnL,EAAiBmL,MAAQrG,EAAKxB,EAAe,QAGpD8H,MA/KsBC,GA+KCrL,EAAiBoL,cA9KvBC,GA+KjBrL,EAAiBoL,WACjBtG,EAAKxB,EAAe,eAAiB9C,GACrCsE,EAAKxB,EAAe,aAAe9C,GACnCsE,EAAKxB,EAAe,gBAAkB9C,EAGtC8K,KACqC,SAAvCxG,EAAKxB,EAAe,iBACpBtD,EAAiBsL,cAAgB/K,GAI/BgL,GACFvL,EAAiBwL,UACjB1G,EAAKxB,EAAe,cACpBuE,GAAY,IAAMlH,EAGhB8K,GAAcxG,EAChBjF,EAAiByL,aAAe3G,EAAKxB,EAAe,iBAIlDyF,GAAc9D,EAChBjF,EAAiB+I,aAAejE,EAAKxB,EAAe,iBAIlDoI,GAAqBzG,EACvBjF,EAAiB0L,oBACf5G,EAAKxB,EAAe,yBAIpBqI,GACF3L,EAAiB2L,gBAAkB7G,EAAKxB,EAAe,mBAGrD6E,GACFnI,EAAiBmI,mBACjBrD,EAAKxB,EAAe,sBAItB,IAEE0H,GAAWzE,GAAsB,KAC7BqF,KAAKC,iBAAiBC,kBAAkBC,SACxC3L,EACJ,MAAO+D,IACPhE,EAAKgE,IAOP,IAAI6H,GAAUjM,EAAOiM,QACjBC,GACFjL,EAAIkL,WACJnM,EAAOoM,aACPpM,EAAOqM,aACPrM,EAAOsM,UACNL,KAAYA,GAAQM,QACrBvM,EAAOwM,YACPxM,EAAOyM,MACPrJ,GACAqE,KAAKC,UAAYD,KAAKC,SAGpBgF,GACFlG,GAAsB,MAAQA,GAAsB,QAElD0F,KAAK3B,GAAY2B,IAAM3L,GAE3B,IAAIkJ,GAAU9D,EAAO4E,GAAa,CAEhCoC,GAAInG,GAAsB,MAAQ/E,EAAYpB,EAE9CK,MAAOS,EAAIyL,UAAYlM,EACvBuK,SAAUA,GACV4B,sBAAuBtM,EACvBuM,QAASzG,KAAeqG,GAAqB5F,KAASzG,GAGtD0M,WAAYvG,GAAsB,MAC9BH,IAAcS,KACdzG,IA0BN,GAvBAoJ,GAAQuD,IAAMxM,EAIVkC,IACF+G,GAAQwD,OAASvK,EAAOuK,OACxBxD,GAAQyD,OAASjL,EAAUS,EAAOwK,SAS/B3L,EAAI4L,SAAS/M,EAAK,4CAInBkK,KAAoBjJ,IACtBoI,GAAQ2D,kBAAoB/L,IAGzBgK,IAAcrK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBkC,EAAU,SAK7B,GAAlC7B,EAAiBwH,QAAQ,OACxB,aAAaxF,KAAKhC,IACnB+I,IAEDhK,EACE,mBACEiB,EACA,SACA6B,EACA,0BAON,IACImK,GA2DAC,GA5DA5D,GAAO,GAGP6D,GAAc,WAKhB,OAFEtN,EAAiBuN,UAAYzI,EAAKxB,EAAe,aAGzBhC,EAAIiM,UAAY,IACrC1I,QAAQzD,EAAkBiJ,IAC1BxF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAASzE,GAKjCmN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKlB,MACDrG,IAAwB,IAAVlD,GAAgB0K,MAAlC,CAEA,IAAIC,EAASnI,EAAO4E,GAAa,CAC/BI,KAAM,SACNoD,YAAaH,EAAOD,EAAKlE,GAAQqD,UAenC,GAXItG,GAAsB,OACxBsH,EAAOE,SAAWvG,KAAKwG,OAAOrH,KAAQsE,GAAQuC,IAnhBnC,MAqhBbA,GAAW,EACXvC,GAAQtE,KAGJJ,GAAsB,UACxBsH,EAAO3C,SAAW1D,KAAKyG,IAAI,EAAG/C,GAAUgD,OAGtCP,IAAS3M,EAAImN,WAEf9E,GAASwE,EAAQzN,EAAcE,QAE/B,IACEU,EAAImN,WAAWC,KAAKpN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU6L,IAC3D,MAAOQ,GAEPhF,GAASwE,EAAQzN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAIgN,QACA,KAAOxL,KAAY/C,GAAS0N,KAClCJ,GAAc1G,MACT6G,IAAY7G,KAAQ0G,IAE7B9M,GAGF2B,EAAqBY,EAAU2K,GAAalN,GAE5C,IAAIgO,GAAOjN,EAAIiN,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuBnM,EAAgBQ,IAAiB,EACxD4L,EAASjH,KAAKyG,IAChBM,GAAK5L,IAAiB,EACtB4L,GAAK3L,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO4E,KAAKkH,IACV,IAKI,EAJJlH,KAAKwG,MACF,MAAQ3L,EAAgBsM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOtK,IAEP,OADAhE,EAAKgE,IACE,IAIXjC,EAAqB,OAAQ,WAC3BgJ,GAAWgD,KACXhM,EACEM,EACA,WACM0I,GAAWgD,OAAYhD,GAAWgD,OAExC3N,KAQJ,IAgCIqO,GAuCAC,GAAUC,GAvEVlB,GAAU,SAAUmB,GACtB,IAAIpE,EAAO,GAIX,IACEA,EAAOoE,GAAajN,EAAuBZ,EAAI0J,UAC/C,MAAOzG,IACPhE,EAAKgE,IAGP,IAAI6K,EAAyBjP,EAAO4L,IACpC,GAAIjE,GAAWsH,GACb,IACErE,EAAOqE,EAAuBrL,KAAK5D,EAAQ,CAAE4K,KAAMA,KAAWA,EAC9D,MAAOxG,IACPF,EAAe,OAAQE,IAK3B,IAhZiB,SAAUwG,GAC3B,IAAK,IAAIhC,KAAK8C,GAAa,CACzB,IAAIwD,EAAgBxD,GAAY9C,GAChC,GAAKsG,EAAL,CAGA,IAAIC,EA1PI,KA2PND,EAAc,GAAcA,EA3PtB,IA2P8CA,EAEtD,GACEC,IAAevE,GACf,IAAIjE,OACF,IAAM/B,EAAYuK,GAAYrK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKuH,GAEP,OAAOrK,GAEX,OAAOC,EA8XH4O,CAAaxE,GAQjB,MAFY,QAARQ,IAAkBjK,EAAIkO,OAAMzE,GAAQzJ,EAAIkO,KAAK9J,MAAM,KAAK,IAErDqF,EAPLxK,EAAKuB,EAAiB,YAAciJ,IAmDpC0E,GAAW,SACbC,EACAC,EACAxH,EACAyH,IAEKA,GAAe9H,GAAWK,KAAWyH,EAAczH,GACxD,IACI0H,EAGEC,EAJFpG,EAAW5B,GAAW8H,GAAeA,EAAc,aAEnD/K,EAAS8K,KAAgD,EAA9BA,EAAc3G,QAAQ,OAGnD2G,GADIG,EAAQH,EAAcjK,MAAM,MACVqK,QACtBF,EAAc,IAAMC,EAAMzG,KAAK,MAGjC,IAAI0B,EAAOiD,GAAQ2B,GAUnB,IARK5E,GAAkB,IAAVzH,GAAekD,KAE1BoD,GAAQqD,QAAUJ,GAAqB5F,KAASzG,EAC5CoJ,GAAQsD,aAAe1G,KAAYoD,GAAQsD,WAAajG,MAC5DT,GAAahG,GAIVuK,GAAQyC,IAAgBzC,EAA7B,CAEAyC,GAAezC,EACflB,GAAKkB,KAAOA,EAGRpE,GAAsB,OACxBkD,GAAKmG,eACHpI,KAAKyG,IAAI5L,EAA2B,aAAK,EAAGtC,EAAO8P,YAAc,IACjE,KACFpG,GAAKqG,gBACHtI,KAAKyG,IACH5L,EAAgBQ,IAAiB,EACjC9C,EAAOgQ,aAAe,IACnB,MAILxJ,GAAsB,MACpBvF,EAAIsB,KAAWmH,GAAKnH,GAAYtB,EAAIsB,IAItCe,GAAUkD,GAAsB,QAClCkD,GAAKuG,aAAe3M,EAAO4M,MAC3BxG,GAAKyG,cAAgB7M,EAAOoL,QAI9B,IAII0B,EAJAC,EAAOrQ,EAAOsQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG5F,KAC/D,MAAOvG,IACPhE,EAAKgE,IAGP2K,GAAgBqB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBvH,QAAQuH,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAG1H,QAAQwH,EAAKE,GAAgB5F,MAGxC,IAAI8F,EAA0BjD,GAC1BA,GAASjI,MApwBH,KAowBgB,GACtBlF,EACJyO,GAAWtB,IACgD,EAAvD7B,GAAmB9C,QAAQ4H,IAC3BA,GAA2BpP,EAC3Bb,EAGJkJ,GAAKgH,OACH,QAAQrN,KAAKkK,OAAkBgC,GAAeR,GAC1CvO,GACCsO,GAEP9G,EAAWD,GAAeC,EAAU,CAClC2C,KAAMhK,EACNiK,KAAMlB,GAAKkB,OAGb,IAAI+F,EAAsB,WACxB/O,EAA2BrB,EAC3B,IAAIqQ,EACFrB,GAAeR,KAAkBvI,GAAsB,MAvI1C,SACjB+I,EACAsB,EACA/B,EACApG,EACAV,EACAuB,GAEIgG,GAAa7B,GAAY,GAAKjE,GAAQqD,QAASvM,GACnD,IAAIuQ,EAAuB,IAAV3N,EAAckD,GAAahG,EAC5CoJ,GAAQqD,QACNgE,IAAepE,GAAqB5F,KAASzG,GAE/C,IAAI0Q,EAAczG,GAAkBuD,KAChCmD,EAAQ1I,GAAeuI,EAAkBnI,GAE7CY,GACE,CACEqE,GAAIlE,GAAQqD,QACZiB,YAAa+C,EACbnG,KAAMmG,EAAa,SAAWnQ,EAC9B6M,UAAWqD,GAAoB/B,EAAWtB,GAAW,KACrDwD,MAAOA,EACP1K,EAAGA,GAEH0B,SAAU/F,EAAU+F,IAEtBuB,GAGFsF,GAAmBrB,GACnBA,GAAWuD,EAEX5N,IAuGE8N,CACE1B,EACAqB,EACA9B,GACAY,EACA1H,EACAuB,IAIJ,GAAK3H,EAmBH+O,SAjBA,IACMjO,GAAUiF,GAAWjF,EAAOwO,sBAC9BxO,EACGwO,qBAAqB,CAAClO,EAAcC,IACpCkO,KAAK,SAAUC,GACd3H,GAAQ4H,QAAUD,EAAkBpO,GACpCyG,GAAQ6H,WAAaF,EAAkBnO,GACvC0N,MAEDY,SAAMZ,GAETA,IAEF,MAAOrC,GACPqC,OAWFa,GAAMxR,EAAOyR,QACbC,GAAeF,GAAMA,GAAIG,UAAYtR,EACrCuR,GAAM5R,EAAO6R,cACbC,GAAgB,YAIhBvG,IAAemG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB7G,GAoBAmH,IAlBrB,WACL,IAEIhH,EAFAjF,EAAMhC,UACNoO,EAAKD,GAAK/N,MAAMiO,KAAMrM,GAY1B,OAVI8B,GAAWoK,OACbjH,EAAQ,IAAIiH,MAAMpH,KAIlBG,EAAQvJ,EAAI4Q,YAAY,UAClBC,UAAUzH,GAAMpK,EAASA,GAEjCuK,EAAMjH,UAAYgC,EAClB+L,GAAI9G,GACGmH,IAMX9P,EACE2P,GACA,WACExC,GAAS,IAEX9O,GAGF2B,EACE,WACA,WACEmN,GAAS,IAEX9O,IAKA+K,IAAuB,QAARH,IAAkB,iBAAkBpL,GACrDmC,EACE,aACA,WACEmN,GAAS,IAEX9O,GAIA+K,IAAa+D,KAEjBtP,EAAOqS,YAAc,SAAUzH,EAAM5C,EAAUuB,GAC7C+F,GAAS,EAAG1E,EAAM5C,EAAUuB,IAQ9B,IAAI+I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUzH,EAAO9C,EAAUyH,IACpCA,GAAe9H,GAAWK,KAAWyH,EAAczH,GAExD,IAAIwK,EAAkB7K,GAAWmD,GAC7BvB,EAAW5B,GAAW8H,GAAeA,EAAc,aACnDgD,SAAmB3H,EAEvB,GAAIwH,GAAWzJ,QAAQ4J,GAAa,IAAMD,EAExC,OADAtO,EAAesH,GAAmB5K,EAAY,aAAe6R,GACtDlJ,IAGT,IACE,GAAIiJ,EAAiB,CACnB,IAAIE,EAAc5H,IAClB,GAAIwH,GAAWzJ,eAAe6J,GAAe,EAK3C,OAJAxO,EACEsH,GACAV,EAAQ,uBAAyB4H,GAE5BnJ,IAETuB,EAAQ4H,GAEV,MAAOtO,IAEP,OADAF,EAAesH,GAAmBpH,IAC3BmF,IAGTuB,GAAS,GAAKA,GAAOhG,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAI6N,EAAc,CAAEhI,KAAM/J,EAAWkK,MAAOA,GACxC8H,GAAa7D,IAAiB5L,EAAQ,EAGtCkD,IAAwB,IAAVlD,IAAgB0K,OAChC8E,EAAY7F,QAAUzM,EACtBsS,EAAY5F,WAAa1M,GAG3B2H,EAAWD,GAAeC,EAAU2K,GAEhC7H,GACFxB,GACE3D,EAAOgN,EAAa,CAClBhF,GAAI7G,KACJkK,MAAO1I,IAAgBsK,GACvBpF,UACGoF,GAAa9D,KAAatI,GAAsB,KAC7CqI,GACA,KAEN7G,SAAU/F,EAAU+F,KAEtBuB,IAKFsJ,GAAmB,SAAU/H,EAAO9C,EAAUuB,GAChDgJ,GAAUzH,EAAO9C,EAAUuB,IAIxBvJ,EAAOwL,MACVxL,EAAOwL,IAAqBqH,IAE9B,IAAIC,GAAY9S,EAAOwL,IAGnBuH,GAAQD,IAAaA,GAAUrK,EAAIqK,GAAUrK,EAAI,GAMrD,IAAK,IAAIqC,MAHT9K,EAAOwL,IAAqBqH,GAGVE,GACZ1O,EAAQ0O,GAAOjI,MACjB1F,MAAMC,QAAQ0N,GAAMjI,KAChByH,GAAUtO,MAAM,KAAM8O,GAAMjI,KAC5ByH,GAAUQ,GAAMjI,MAGxB,MAAOwD,IACPnO,EAAUmO,IAnJY,IAAU3D,GACxBqH,GAnoBkB1G,GA/N9B,CAu/BEtL,OACA,uBACA"} \ No newline at end of file +{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/latest.dev.js b/dist/latest/custom/latest.dev.js index cd112b4..d20ae14 100644 --- a/dist/latest/custom/latest.dev.js +++ b/dist/latest/custom/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; df4b; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 23b9; v12) */ /* eslint-env browser */ (function ( @@ -566,7 +566,7 @@ var sendOnLeave = function (id, push) { if (!collectDataOnLeave) return; - if (pageLoadId && pages === 0 && !getPath()) return; + if (pageLoadId && !lastSendPath && !getPath()) return; var append = assign(basePayload, { type: "append", @@ -743,7 +743,7 @@ // Obfuscate personal data in URL by dropping the search and hash var path = getPath(pathOverwrite); - if (!path && pages === 0 && pageLoadId) { + if (!path && !lastSendPath && pageLoadId) { // An ignored initial page must not receive event or leave enrichment. payload.page_id = collectDataOnLeave ? uuid() : undefinedVar; if (payload.session_id === pageLoadId) payload.session_id = uuid(); @@ -966,7 +966,7 @@ var firstPage = !userNavigated && pages < 2; // Manual collection may not have declared an allowed pageview yet. - if (pageLoadId && pages === 0 && !getPath()) { + if (pageLoadId && !lastSendPath && !getPath()) { eventParams.page_id = undefinedVar; eventParams.session_id = undefinedVar; } diff --git a/dist/latest/custom/latest.js b/dist/latest/custom/latest.js index 038d9fb..f1a553e 100644 --- a/dist/latest/custom/latest.js +++ b/dist/latest/custom/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 3c36; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 5b66; v12) */ -!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); +!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); //# sourceMappingURL=latest.js.map \ No newline at end of file diff --git a/dist/latest/custom/latest.js.map b/dist/latest/custom/latest.js.map index bec680c..798c515 100644 --- a/dist/latest/custom/latest.js.map +++ b/dist/latest/custom/latest.js.map @@ -1 +1 @@ -{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && pages === 0 && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && pages === 0 && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/light.js b/dist/latest/custom/light.js index 16c43ad..64b0e97 100644 --- a/dist/latest/custom/light.js +++ b/dist/latest/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; cbbc; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 027a; v12) */ -!function(l,e,t,f){try{var g=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,d=l.location,h=d.host,i=l.document,o=m.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,p=decodeURIComponent,u=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,x=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var $=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},I=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||A(E,V)||"sa",C=e.strictUtm||"true"==A(E,"strict-utm"),H=B+"_loaded";if(1==l[H])return f(c+"twice");l.sa_event_loaded=!0,l[H]=!0;var T,F=function(t,e,n){t=n?t:I(M,Z,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=g}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||A(E,"hostname"),z=L||h,J={version:"custom_light_12",hostname:z};e.mode||A(E,"mode");try{T=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}x&&(J.bot=!0);var M=I(J,{ua:o,https:d.protocol==n,timezone:T,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!1,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==h&&(M.hostname_original=h),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||L||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||A(E,"referrer")||i.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||g,K=function(e,t){if(0,!N||0!==k||X()){var n=I(J,{type:"append",original_id:t?e:M.page_id});if(t||!m.sendBeacon)F(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",u(n))}catch(r){F(n,0,!0)}}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:g;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||g);F({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);$(t)&&-1"); +!function(l,e,t,f){try{var g=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,d=l.location,h=d.host,i=l.document,o=m.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,p=decodeURIComponent,u=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,x=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var $=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},I=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||A(E,V)||"sa",C=e.strictUtm||"true"==A(E,"strict-utm"),H=B+"_loaded";if(1==l[H])return f(c+"twice");l.sa_event_loaded=!0,l[H]=!0;var T,F=function(t,e,n){t=n?t:I(M,Z,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=g}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||A(E,"hostname"),z=L||h,J={version:"custom_light_12",hostname:z};e.mode||A(E,"mode");try{T=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}x&&(J.bot=!0);var M=I(J,{ua:o,https:d.protocol==n,timezone:T,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!1,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==h&&(M.hostname_original=h),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||L||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||A(E,"referrer")||i.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||g,K=function(e,t){if(0,!N||P||X()){var n=I(J,{type:"append",original_id:t?e:M.page_id});if(t||!m.sendBeacon)F(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",u(n))}catch(r){F(n,0,!0)}}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:g;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||g);F({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);$(t)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/latest/custom/light.js.map b/dist/latest/custom/light.js.map index b4d6c35..9f56f33 100644 --- a/dist/latest/custom/light.js.map +++ b/dist/latest/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && pages === 0 && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/proxy.js b/dist/latest/custom/proxy.js index 0c0c53f..c606cdc 100644 --- a/dist/latest/custom/proxy.js +++ b/dist/latest/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; a078; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; abbe; v12) */ -!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",I="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); +!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",I="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/latest/custom/proxy.js.map b/dist/latest/custom/proxy.js.map index 2d1a3fa..027334e 100644 --- a/dist/latest/custom/proxy.js.map +++ b/dist/latest/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && pages === 0 && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && pages === 0 && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAhBW3B,WAgB4BR,EACvCoC,EAAkBf,EAAIe,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAASzB,EAAI0B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK5B,KAAe,WAAW4B,KAAK5B,GACxD6B,EAAStD,EAAOsD,OAIhBC,EACFhC,EAAIiC,eAAiBjC,EAAIkC,cAAc,gBAAkBvD,EAAU,MAOrEE,EAAO,WAEL,IAAIsD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK9C,EAAIV,KAAMU,EAAK4C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnChE,EAAK,iBAAmB+D,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWjG,EAAOkG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKnG,GAAkBqF,OAG5DrF,EAAmB0F,EAAO1F,EAAkBgG,GAExCE,GAAa/F,EAAK,WAAYH,GAGlC,IAAIoG,GACFpG,EAAiBoG,YAActB,EAAKxB,EAAe,gBAE7B,iBAAf8C,IACN,yEAAyEhD,KACxEgD,MAGFA,GAAahG,GAIf,IA+EIiG,GA/EAC,GAAgBrB,EAClBjF,EAAiBsG,eAAiBxB,EAAKxB,EAAe,mBAGpDiD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU7B,GAC7B,OAAO,IAAI8B,OAAO,IAAMF,GAAoBpD,KAAKwB,KAChDS,QAIHsB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe/G,EAAOgH,QAAUhH,EAAOiH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOnD,GACP,OAAO8C,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF7H,EAAiB4H,KACjB9C,EAAKxB,EAAesE,KAqzBxB,KAlzBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBlI,EAAO8H,GAAY,aACpCtC,EAAS0C,KAAiBF,EAAWrC,EAAOqC,EAAUE,IAC1D,IAAIC,EAA4BnI,EAAOoI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACFhI,EACEgI,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOrC,EACLqC,EACAG,EAA0BvE,KAAK5D,EAAQ2F,EAAOqC,EAAUC,KAE1D,MAAO7D,GACPF,EAAe,WAAYE,KAU3BiE,GACFpI,EAAiBoI,WACjBtD,EAAKxB,EAAe,eAAiB9C,EAInC6H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAKhG,EACvD,IAAIiI,GAAKD,GAAmBrH,EAAIuH,QAC7B/E,MAAM,GACN4B,MAAM,KACNmB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM9F,GAAgB,EAAJoI,GAASD,EAAShF,MAAMiF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAShF,MAAM,EAAGiF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIrE,GAAasE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAY1D,OAAe9E,EAInC,IAAImG,OAAOwC,EAAO,KAAK9F,KAAKsF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKjG,EACFoI,GAAKpI,GA+BV+I,GAAiBtB,GAAY,UACjC,GAAI9H,EAAOoJ,KAAmB7I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOqJ,gBAAkB9I,EACzBP,EAAOoJ,IAAkB7I,EAOzB,IAAI+I,GAAW,SAAUrB,EAAMsB,EAAUC,GACvCvB,EAAOuB,EAAevB,EAAOtC,EAAO8D,GAASC,GAAMzB,GAE/ChH,EAAI0I,QAAUH,IAAcvB,EAAK0B,MAAQpJ,GACzCU,EAAI2I,qBAAuBJ,IAAcvB,EAAK4B,KAAOtJ,GAGzD,IAAIuJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJ7H,EACA,eACAmC,OAAO4B,KAAK6B,GACTvB,OAAO,SAAUyD,GAChB,OAAOlC,EAAKkC,IAAQ9J,IAErB4I,IAAI,SAAUkB,GACb,OACEtI,EAAuBsI,GACvB,IACAtI,EAAuBoG,EAAKkC,MAG/BjB,KAAK,KACR,SACArC,KAAKD,OAILwD,GACFnK,EAAiBoK,UAAYtF,EAAKxB,EAAe,YAC/C+G,GAAkBF,IAAuB/I,EAEzCkJ,GAAc,CAChBC,QAmqBJ,kBAlqBIH,SAAUC,IASZnK,EAAY,SAAUsK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJrK,EAAKqK,GACLnB,GACE3D,EAAO4E,GAAa,CAClBI,KAAM9J,EACNuD,MAAOqG,EACPG,KAAMzJ,EAAI0J,WAEZxK,EACAE,IAMJ4B,EACEtB,EACA,SAAUiK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASlC,QAAQ3I,IAC3CC,EAAU2K,EAAME,UAGpBxK,GAOF,IAwDIyK,GAxDAC,GAAQtE,KAERuE,GAAW,EAOXC,GAAOnL,EAAiBmL,MAAQrG,EAAKxB,EAAe,QAGpD8H,MA/KsBC,GA+KCrL,EAAiBoL,cA9KvBC,GA+KjBrL,EAAiBoL,WACjBtG,EAAKxB,EAAe,eAAiB9C,GACrCsE,EAAKxB,EAAe,aAAe9C,GACnCsE,EAAKxB,EAAe,gBAAkB9C,EAGtC8K,KACqC,SAAvCxG,EAAKxB,EAAe,iBACpBtD,EAAiBsL,cAAgB/K,GAI/BgL,GACFvL,EAAiBwL,UACjB1G,EAAKxB,EAAe,cACpBuE,GAAY,IAAMlH,EAGhB8K,GAAcxG,EAChBjF,EAAiByL,aAAe3G,EAAKxB,EAAe,iBAIlDyF,GAAc9D,EAChBjF,EAAiB+I,aAAejE,EAAKxB,EAAe,iBAIlDoI,GAAqBzG,EACvBjF,EAAiB0L,oBACf5G,EAAKxB,EAAe,yBAIpBqI,GACF3L,EAAiB2L,gBAAkB7G,EAAKxB,EAAe,mBAGrD6E,GACFnI,EAAiBmI,mBACjBrD,EAAKxB,EAAe,sBAItB,IAEE0H,GAAWzE,GAAsB,KAC7BqF,KAAKC,iBAAiBC,kBAAkBC,SACxC3L,EACJ,MAAO+D,IACPhE,EAAKgE,IAOP,IAAI6H,GAAUjM,EAAOiM,QACjBC,GACFjL,EAAIkL,WACJnM,EAAOoM,aACPpM,EAAOqM,aACPrM,EAAOsM,UACNL,KAAYA,GAAQM,QACrBvM,EAAOwM,YACPxM,EAAOyM,MACPrJ,GACAqE,KAAKC,UAAYD,KAAKC,SAGpBgF,GACFlG,GAAsB,MAAQA,GAAsB,QAElD0F,KAAK3B,GAAY2B,IAAM3L,GAE3B,IAAIkJ,GAAU9D,EAAO4E,GAAa,CAEhCoC,GAAInG,GAAsB,MAAQ/E,EAAYpB,EAE9CK,MAAOS,EAAIyL,UAAYlM,EACvBuK,SAAUA,GACV4B,sBAAuBtM,EACvBuM,QAASzG,KAAeqG,GAAqB5F,KAASzG,GAGtD0M,WAAYvG,GAAsB,MAC9BH,IAAcS,KACdzG,IA0BN,GAvBAoJ,GAAQuD,IAAMxM,EAIVkC,IACF+G,GAAQwD,OAASvK,EAAOuK,OACxBxD,GAAQyD,OAASjL,EAAUS,EAAOwK,SAS/B3L,EAAI4L,SAAS/M,EAAK,4CAInBkK,KAAoBjJ,IACtBoI,GAAQ2D,kBAAoB/L,IAGzBgK,IAAcrK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBkC,EAAU,SAK7B,GAAlC7B,EAAiBwH,QAAQ,OACxB,aAAaxF,KAAKhC,IACnB+I,IAEDhK,EACE,mBACEiB,EACA,SACA6B,EACA,0BAON,IACImK,GA2DAC,GA5DA5D,GAAO,GAGP6D,GAAc,WAKhB,OAFEtN,EAAiBuN,UAAYzI,EAAKxB,EAAe,aAGzBhC,EAAIiM,UAAY,IACrC1I,QAAQzD,EAAkBiJ,IAC1BxF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAASzE,GAKjCmN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKlB,MACDrG,IAAwB,IAAVlD,GAAgB0K,MAAlC,CAEA,IAAIC,EAASnI,EAAO4E,GAAa,CAC/BI,KAAM,SACNoD,YAAaH,EAAOD,EAAKlE,GAAQqD,UAenC,GAXItG,GAAsB,OACxBsH,EAAOE,SAAWvG,KAAKwG,OAAOrH,KAAQsE,GAAQuC,IAnhBnC,MAqhBbA,GAAW,EACXvC,GAAQtE,KAGJJ,GAAsB,UACxBsH,EAAO3C,SAAW1D,KAAKyG,IAAI,EAAG/C,GAAUgD,OAGtCP,IAAS3M,EAAImN,WAEf9E,GAASwE,EAAQzN,EAAcE,QAE/B,IACEU,EAAImN,WAAWC,KAAKpN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU6L,IAC3D,MAAOQ,GAEPhF,GAASwE,EAAQzN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAIgN,QACA,KAAOxL,KAAY/C,GAAS0N,KAClCJ,GAAc1G,MACT6G,IAAY7G,KAAQ0G,IAE7B9M,GAGF2B,EAAqBY,EAAU2K,GAAalN,GAE5C,IAAIgO,GAAOjN,EAAIiN,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuBnM,EAAgBQ,IAAiB,EACxD4L,EAASjH,KAAKyG,IAChBM,GAAK5L,IAAiB,EACtB4L,GAAK3L,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO4E,KAAKkH,IACV,IAKI,EAJJlH,KAAKwG,MACF,MAAQ3L,EAAgBsM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOtK,IAEP,OADAhE,EAAKgE,IACE,IAIXjC,EAAqB,OAAQ,WAC3BgJ,GAAWgD,KACXhM,EACEM,EACA,WACM0I,GAAWgD,OAAYhD,GAAWgD,OAExC3N,KAQJ,IAgCIqO,GAuCAC,GAAUC,GAvEVlB,GAAU,SAAUmB,GACtB,IAAIpE,EAAO,GAIX,IACEA,EAAOoE,GAAajN,EAAuBZ,EAAI0J,UAC/C,MAAOzG,IACPhE,EAAKgE,IAGP,IAAI6K,EAAyBjP,EAAO4L,IACpC,GAAIjE,GAAWsH,GACb,IACErE,EAAOqE,EAAuBrL,KAAK5D,EAAQ,CAAE4K,KAAMA,KAAWA,EAC9D,MAAOxG,IACPF,EAAe,OAAQE,IAK3B,IAhZiB,SAAUwG,GAC3B,IAAK,IAAIhC,KAAK8C,GAAa,CACzB,IAAIwD,EAAgBxD,GAAY9C,GAChC,GAAKsG,EAAL,CAGA,IAAIC,EA1PI,KA2PND,EAAc,GAAcA,EA3PtB,IA2P8CA,EAEtD,GACEC,IAAevE,GACf,IAAIjE,OACF,IAAM/B,EAAYuK,GAAYrK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKuH,GAEP,OAAOrK,GAEX,OAAOC,EA8XH4O,CAAaxE,GAQjB,MAFY,QAARQ,IAAkBjK,EAAIkO,OAAMzE,GAAQzJ,EAAIkO,KAAK9J,MAAM,KAAK,IAErDqF,EAPLxK,EAAKuB,EAAiB,YAAciJ,IAmDpC0E,GAAW,SACbC,EACAC,EACAxH,EACAyH,IAEKA,GAAe9H,GAAWK,KAAWyH,EAAczH,GACxD,IACI0H,EAGEC,EAJFpG,EAAW5B,GAAW8H,GAAeA,EAAc,aAEnD/K,EAAS8K,KAAgD,EAA9BA,EAAc3G,QAAQ,OAGnD2G,GADIG,EAAQH,EAAcjK,MAAM,MACVqK,QACtBF,EAAc,IAAMC,EAAMzG,KAAK,MAGjC,IAAI0B,EAAOiD,GAAQ2B,GAUnB,IARK5E,GAAkB,IAAVzH,GAAekD,KAE1BoD,GAAQqD,QAAUJ,GAAqB5F,KAASzG,EAC5CoJ,GAAQsD,aAAe1G,KAAYoD,GAAQsD,WAAajG,MAC5DT,GAAahG,GAIVuK,GAAQyC,IAAgBzC,EAA7B,CAEAyC,GAAezC,EACflB,GAAKkB,KAAOA,EAGRpE,GAAsB,OACxBkD,GAAKmG,eACHpI,KAAKyG,IAAI5L,EAA2B,aAAK,EAAGtC,EAAO8P,YAAc,IACjE,KACFpG,GAAKqG,gBACHtI,KAAKyG,IACH5L,EAAgBQ,IAAiB,EACjC9C,EAAOgQ,aAAe,IACnB,MAILxJ,GAAsB,MACpBvF,EAAIsB,KAAWmH,GAAKnH,GAAYtB,EAAIsB,IAItCe,GAAUkD,GAAsB,QAClCkD,GAAKuG,aAAe3M,EAAO4M,MAC3BxG,GAAKyG,cAAgB7M,EAAOoL,QAI9B,IAII0B,EAJAC,EAAOrQ,EAAOsQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG5F,KAC/D,MAAOvG,IACPhE,EAAKgE,IAGP2K,GAAgBqB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBvH,QAAQuH,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAG1H,QAAQwH,EAAKE,GAAgB5F,MAGxC,IAAI8F,EAA0BjD,GAC1BA,GAASjI,MApwBH,KAowBgB,GACtBlF,EACJyO,GAAWtB,IACgD,EAAvD7B,GAAmB9C,QAAQ4H,IAC3BA,GAA2BpP,EAC3Bb,EAGJkJ,GAAKgH,OACH,QAAQrN,KAAKkK,OAAkBgC,GAAeR,GAC1CvO,GACCsO,GAEP9G,EAAWD,GAAeC,EAAU,CAClC2C,KAAMhK,EACNiK,KAAMlB,GAAKkB,OAGb,IAAI+F,EAAsB,WACxB/O,EAA2BrB,EAC3B,IAAIqQ,EACFrB,GAAeR,KAAkBvI,GAAsB,MAvI1C,SACjB+I,EACAsB,EACA/B,EACApG,EACAV,EACAuB,GAEIgG,GAAa7B,GAAY,GAAKjE,GAAQqD,QAASvM,GACnD,IAAIuQ,EAAuB,IAAV3N,EAAckD,GAAahG,EAC5CoJ,GAAQqD,QACNgE,IAAepE,GAAqB5F,KAASzG,GAE/C,IAAI0Q,EAAczG,GAAkBuD,KAChCmD,EAAQ1I,GAAeuI,EAAkBnI,GAE7CY,GACE,CACEqE,GAAIlE,GAAQqD,QACZiB,YAAa+C,EACbnG,KAAMmG,EAAa,SAAWnQ,EAC9B6M,UAAWqD,GAAoB/B,EAAWtB,GAAW,KACrDwD,MAAOA,EACP1K,EAAGA,GAEH0B,SAAU/F,EAAU+F,IAEtBuB,GAGFsF,GAAmBrB,GACnBA,GAAWuD,EAEX5N,IAuGE8N,CACE1B,EACAqB,EACA9B,GACAY,EACA1H,EACAuB,IAIJ,GAAK3H,EAmBH+O,SAjBA,IACMjO,GAAUiF,GAAWjF,EAAOwO,sBAC9BxO,EACGwO,qBAAqB,CAAClO,EAAcC,IACpCkO,KAAK,SAAUC,GACd3H,GAAQ4H,QAAUD,EAAkBpO,GACpCyG,GAAQ6H,WAAaF,EAAkBnO,GACvC0N,MAEDY,SAAMZ,GAETA,IAEF,MAAOrC,GACPqC,OAWFa,GAAMxR,EAAOyR,QACbC,GAAeF,GAAMA,GAAIG,UAAYtR,EACrCuR,GAAM5R,EAAO6R,cACbC,GAAgB,YAIhBvG,IAAemG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB7G,GAoBAmH,IAlBrB,WACL,IAEIhH,EAFAjF,EAAMhC,UACNoO,EAAKD,GAAK/N,MAAMiO,KAAMrM,GAY1B,OAVI8B,GAAWoK,OACbjH,EAAQ,IAAIiH,MAAMpH,KAIlBG,EAAQvJ,EAAI4Q,YAAY,UAClBC,UAAUzH,GAAMpK,EAASA,GAEjCuK,EAAMjH,UAAYgC,EAClB+L,GAAI9G,GACGmH,IAMX9P,EACE2P,GACA,WACExC,GAAS,IAEX9O,GAGF2B,EACE,WACA,WACEmN,GAAS,IAEX9O,IAKA+K,IAAuB,QAARH,IAAkB,iBAAkBpL,GACrDmC,EACE,aACA,WACEmN,GAAS,IAEX9O,GAIA+K,IAAa+D,KAEjBtP,EAAOqS,YAAc,SAAUzH,EAAM5C,EAAUuB,GAC7C+F,GAAS,EAAG1E,EAAM5C,EAAUuB,IAQ9B,IAAI+I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUzH,EAAO9C,EAAUyH,IACpCA,GAAe9H,GAAWK,KAAWyH,EAAczH,GAExD,IAAIwK,EAAkB7K,GAAWmD,GAC7BvB,EAAW5B,GAAW8H,GAAeA,EAAc,aACnDgD,SAAmB3H,EAEvB,GAAIwH,GAAWzJ,QAAQ4J,GAAa,IAAMD,EAExC,OADAtO,EAAesH,GAAmB5K,EAAY,aAAe6R,GACtDlJ,IAGT,IACE,GAAIiJ,EAAiB,CACnB,IAAIE,EAAc5H,IAClB,GAAIwH,GAAWzJ,eAAe6J,GAAe,EAK3C,OAJAxO,EACEsH,GACAV,EAAQ,uBAAyB4H,GAE5BnJ,IAETuB,EAAQ4H,GAEV,MAAOtO,IAEP,OADAF,EAAesH,GAAmBpH,IAC3BmF,IAGTuB,GAAS,GAAKA,GAAOhG,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAI6N,EAAc,CAAEhI,KAAM/J,EAAWkK,MAAOA,GACxC8H,GAAa7D,IAAiB5L,EAAQ,EAGtCkD,IAAwB,IAAVlD,IAAgB0K,OAChC8E,EAAY7F,QAAUzM,EACtBsS,EAAY5F,WAAa1M,GAG3B2H,EAAWD,GAAeC,EAAU2K,GAEhC7H,GACFxB,GACE3D,EAAOgN,EAAa,CAClBhF,GAAI7G,KACJkK,MAAO1I,IAAgBsK,GACvBpF,UACGoF,GAAa9D,KAAatI,GAAsB,KAC7CqI,GACA,KAEN7G,SAAU/F,EAAU+F,KAEtBuB,IAKFsJ,GAAmB,SAAU/H,EAAO9C,EAAUuB,GAChDgJ,GAAUzH,EAAO9C,EAAUuB,IAIxBvJ,EAAOwL,MACVxL,EAAOwL,IAAqBqH,IAE9B,IAAIC,GAAY9S,EAAOwL,IAGnBuH,GAAQD,IAAaA,GAAUrK,EAAIqK,GAAUrK,EAAI,GAMrD,IAAK,IAAIqC,MAHT9K,EAAOwL,IAAqBqH,GAGVE,GACZ1O,EAAQ0O,GAAOjI,MACjB1F,MAAMC,QAAQ0N,GAAMjI,KAChByH,GAAUtO,MAAM,KAAM8O,GAAMjI,KAC5ByH,GAAUQ,GAAMjI,MAGxB,MAAOwD,IACPnO,EAAUmO,IAnJY,IAAU3D,GACxBqH,GAnoBkB1G,GA/N9B,CAu/BEtL,OACA,uBACA"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/hello.js b/dist/latest/hello.js index 4740027..837a855 100644 --- a/dist/latest/hello.js +++ b/dist/latest/hello.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; f8e7) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 0b99) */ -!function(h,e,t,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,q="https://queue."+t,M=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+t+'"]');m=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,e)};var F=function(e,t){m("Error in your "+e+" function:",t)},L=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},W=function(e){return"string"==typeof e},G=function(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(e,t){return e&&e.getAttribute("data-"+t)},Y=function(e){return Array.isArray(e)?e:W(e)&&e.length?e.split(/, ?/):[]},Z=function(e){return e&&e.constructor===Object},K=function(){for(var e={},t=arguments,n=0;n>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},oe=function(e){return"function"==typeof e},ce="namespace",se=e[ce]||J(z,ce)||"sa",ue=function(e,t){var n=h[se+"_metadata"];Z(n)&&(e=K(e,n));var r=h[Me];if(!oe(r))return Me&&m(Me+" not found, set window."+Me),e;try{return K(e,r.call(h,K(e,t)))}catch(a){F("metadata",a)}},le=e.strictUtm||J(z,"strict-utm")==r,pe=function(i,e){te=!i&&re("q")?"":y;var t=(e||s.search).slice(1).split("&").filter(function(e){var t=e.indexOf("=");te!==y&&0>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},oe=function(e){return"function"==typeof e},ce="namespace",se=e[ce]||J(z,ce)||"sa",ue=function(e,t){var n=h[se+"_metadata"];Z(n)&&(e=K(e,n));var r=h[Me];if(!oe(r))return Me&&m(Me+" not found, set window."+Me),e;try{return K(e,r.call(h,K(e,t)))}catch(a){F("metadata",a)}},le=e.strictUtm||J(z,"strict-utm")==r,pe=function(i,e){te=!i&&re("q")?"":y;var t=(e||s.search).slice(1).split("&").filter(function(e){var t=e.indexOf("=");te!==y&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && pages === 0 && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && pages === 0 && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAAaC,iBAA0BpC,EACvCqC,EAAkBhB,EAAIgB,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAAS1B,EAAI2B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK7B,KAAe,WAAW6B,KAAK7B,GACxD8B,EAASvD,EAAOuD,OAIhBC,EACFjC,EAAIkC,eAAiBlC,EAAImC,cAAc,gBAAkBxD,EAAU,MAOrEE,EAAO,WAEL,IAAIuD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK/C,EAAIV,KAAMU,EAAK6C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnCjE,EAAK,iBAAmBgE,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWlG,EAAOmG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKpG,GAAkBsF,OAG5DtF,EAAmB2F,EAAO3F,EAAkBiG,GAExCE,GAAahG,EAAK,WAAYH,GAGlC,IAAIqG,GACFrG,EAAiBqG,YAActB,EAAKxB,EAAe,gBAE7B,iBAAf8C,IACN,yEAAyEhD,KACxEgD,MAGFA,GAAajG,GAIf,IA+EIkG,GA/EAC,GAAgBrB,EAClBlF,EAAiBuG,eAAiBxB,EAAKxB,EAAe,mBAGpDiD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU7B,GAC7B,OAAO,IAAI8B,OAAO,IAAMF,GAAoBpD,KAAKwB,KAChDS,QAIHsB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAehH,EAAOiH,QAAUjH,EAAOkH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOnD,GACP,OAAO8C,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF9H,EAAiB6H,KACjB9C,EAAKxB,EAAesE,KAqzBxB,KAlzBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBnI,EAAO+H,GAAY,aACpCtC,EAAS0C,KAAiBF,EAAWrC,EAAOqC,EAAUE,IAC1D,IAAIC,EAA4BpI,EAAOqI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACFjI,EACEiI,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOrC,EACLqC,EACAG,EAA0BvE,KAAK7D,EAAQ4F,EAAOqC,EAAUC,KAE1D,MAAO7D,GACPF,EAAe,WAAYE,KAU3BiE,GACFrI,EAAiBqI,WACjBtD,EAAKxB,EAAe,eAAiB/C,EAInC8H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAKjG,EACvD,IAAIkI,GAAKD,GAAmBtH,EAAIwH,QAC7B/E,MAAM,GACN4B,MAAM,KACNmB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM/F,GAAgB,EAAJqI,GAASD,EAAShF,MAAMiF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAShF,MAAM,EAAGiF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIrE,GAAasE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAY1D,OAAe/E,EAInC,IAAIoG,OAAOwC,EAAO,KAAK9F,KAAKsF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKlG,EACFqI,GAAKrI,GA+BVgJ,GAAiBtB,GAAY,UACjC,GAAI/H,EAAOqJ,KAAmB9I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOsJ,gBAAkB/I,EACzBP,EAAOqJ,IAAkB9I,EAOzB,IAAIgJ,GAAW,SAAUrB,EAAMsB,EAAUC,GACvCvB,EAAOuB,EAAevB,EAAOtC,EAAO8D,GAASC,GAAMzB,GAE/CjH,EAAI2I,QAAUH,IAAcvB,EAAK0B,MAAQrJ,GACzCU,EAAI4I,qBAAuBJ,IAAcvB,EAAK4B,KAAOvJ,GAGzD,IAAIwJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJ9H,EACA,eACAoC,OAAO4B,KAAK6B,GACTvB,OAAO,SAAUyD,GAChB,OAAOlC,EAAKkC,IAAQ/J,IAErB6I,IAAI,SAAUkB,GACb,OACEvI,EAAuBuI,GACvB,IACAvI,EAAuBqG,EAAKkC,MAG/BjB,KAAK,KACR,SACArC,KAAKD,OAILwD,GACFpK,EAAiBqK,UAAYtF,EAAKxB,EAAe,YAC/C+G,GAAkBF,IAAuBhJ,EAEzCmJ,GAAc,CAChBC,QAmqBJ,eAlqBIH,SAAUC,IASZpK,EAAY,SAAUuK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJtK,EAAKsK,GACLnB,GACE3D,EAAO4E,GAAa,CAClBI,KAAM/J,EACNwD,MAAOqG,EACPG,KAAM1J,EAAI2J,WAEZzK,EACAE,IAMJ4B,EACEtB,EACA,SAAUkK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASlC,QAAQ5I,IAC3CC,EAAU4K,EAAME,UAGpBzK,GAOF,IAwDI0K,GAxDAC,GAAQtE,KAERuE,GAAW,EAOXC,GAAOpL,EAAiBoL,MAAQrG,EAAKxB,EAAe,QAGpD8H,MA/KsBC,GA+KCtL,EAAiBqL,cA9KvBC,GA+KjBtL,EAAiBqL,WACjBtG,EAAKxB,EAAe,eAAiB/C,GACrCuE,EAAKxB,EAAe,aAAe/C,GACnCuE,EAAKxB,EAAe,gBAAkB/C,EAGtC+K,KACqC,SAAvCxG,EAAKxB,EAAe,iBACpBvD,EAAiBuL,cAAgBhL,GAI/BiL,GACFxL,EAAiByL,UACjB1G,EAAKxB,EAAe,cACpBuE,GAAY,IAAMnH,EAGhB+K,GAAcxG,EAChBlF,EAAiB0L,aAAe3G,EAAKxB,EAAe,iBAIlDyF,GAAc9D,EAChBlF,EAAiBgJ,aAAejE,EAAKxB,EAAe,iBAIlDoI,GAAqBzG,EACvBlF,EAAiB2L,oBACf5G,EAAKxB,EAAe,yBAIpBqI,GACF5L,EAAiB4L,gBAAkB7G,EAAKxB,EAAe,mBAGrD6E,GACFpI,EAAiBoI,mBACjBrD,EAAKxB,EAAe,sBAItB,IAEE0H,GAAWzE,GAAsB,KAC7BqF,KAAKC,iBAAiBC,kBAAkBC,SACxC5L,EACJ,MAAOgE,IACPjE,EAAKiE,IAOP,IAAI6H,GAAUlM,EAAOkM,QACjBC,GACFlL,EAAImL,WACJpM,EAAOqM,aACPrM,EAAOsM,aACPtM,EAAOuM,UACNL,KAAYA,GAAQM,QACrBxM,EAAOyM,YACPzM,EAAO0M,MACPrJ,GACAqE,KAAKC,UAAYD,KAAKC,SAGpBgF,GACFlG,GAAsB,MAAQA,GAAsB,QAElD0F,KAAK3B,GAAY2B,IAAM5L,GAE3B,IAAImJ,GAAU9D,EAAO4E,GAAa,CAEhCoC,GAAInG,GAAsB,MAAQhF,EAAYpB,EAE9CK,MAAOS,EAAImB,UAAY5B,EACvBwK,SAAUA,GACV2B,sBAAuBtM,EACvBuM,QAASxG,KAAeqG,GAAqB5F,KAAS1G,GAGtD0M,WAAYtG,GAAsB,MAC9BH,IAAcS,KACd1G,IA0BN,GAvBAqJ,GAAQsD,IAAMxM,EAIVmC,IACF+G,GAAQuD,OAAStK,EAAOsK,OACxBvD,GAAQwD,OAASjL,EAAUU,EAAOuK,SAS/B3L,EAAI4L,SAAS/M,EAAK,4CAInBmK,KAAoBlJ,IACtBqI,GAAQ0D,kBAAoB/L,IAGzBiK,IAActK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBmC,EAAU,SAK7B,GAAlC9B,EAAiByH,QAAQ,OACxB,aAAaxF,KAAKjC,IACnBgJ,IAEDjK,EACE,mBACEiB,EACA,SACA8B,EACA,0BAON,IACIkK,GA2DAC,GA5DA3D,GAAO,GAGP4D,GAAc,WAKhB,OAFEtN,EAAiBuN,UAAYxI,EAAKxB,EAAe,aAGzBjC,EAAIiM,UAAY,IACrCzI,QAAQ1D,EAAkBkJ,IAC1BxF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS1E,GAKjCmN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKjB,MACDrG,IAAwB,IAAVlD,GAAgByK,MAAlC,CAEA,IAAIC,EAASlI,EAAO4E,GAAa,CAC/BI,KAAM,SACNmD,YAAaH,EAAOD,EAAKjE,GAAQoD,UAenC,GAXIrG,GAAsB,OACxBqH,EAAOE,SAAWtG,KAAKuG,OAAOpH,KAAQsE,GAAQsC,IAnhBnC,MAqhBbA,GAAW,EACXtC,GAAQtE,KAGJJ,GAAsB,UACxBqH,EAAO1C,SAAW1D,KAAKwG,IAAI,EAAG9C,GAAU+C,OAGtCP,IAAS3M,EAAImN,WAEf7E,GAASuE,EAAQzN,EAAcE,QAE/B,IACEU,EAAImN,WAAWC,KAAKpN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU6L,IAC3D,MAAOQ,GAEP/E,GAASuE,EAAQzN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAIgN,QACA,KAAOvL,KAAYhD,GAAS0N,KAClCJ,GAAczG,MACT4G,IAAY5G,KAAQyG,IAE7B9M,GAGF2B,EAAqBa,EAAU0K,GAAalN,GAE5C,IAAIgO,GAAOjN,EAAIiN,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuBlM,EAAgBQ,IAAiB,EACxD2L,EAAShH,KAAKwG,IAChBM,GAAK3L,IAAiB,EACtB2L,GAAK1L,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO4E,KAAKiH,IACV,IAKI,EAJJjH,KAAKuG,MACF,MAAQ1L,EAAgBqM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOrK,IAEP,OADAjE,EAAKiE,IACE,IAIXlC,EAAqB,OAAQ,WAC3BiJ,GAAW+C,KACXhM,EACEO,EACA,WACM0I,GAAW+C,OAAY/C,GAAW+C,OAExC3N,KAQJ,IAgCIqO,GAuCAC,GAAUC,GAvEVlB,GAAU,SAAUmB,GACtB,IAAInE,EAAO,GAIX,IACEA,EAAOmE,GAAajN,EAAuBZ,EAAI2J,UAC/C,MAAOzG,IACPjE,EAAKiE,IAGP,IAAI4K,EAAyBjP,EAAO6L,IACpC,GAAIjE,GAAWqH,GACb,IACEpE,EAAOoE,EAAuBpL,KAAK7D,EAAQ,CAAE6K,KAAMA,KAAWA,EAC9D,MAAOxG,IACPF,EAAe,OAAQE,IAK3B,IAhZiB,SAAUwG,GAC3B,IAAK,IAAIhC,KAAK8C,GAAa,CACzB,IAAIuD,EAAgBvD,GAAY9C,GAChC,GAAKqG,EAAL,CAGA,IAAIC,EA1PI,KA2PND,EAAc,GAAcA,EA3PtB,IA2P8CA,EAEtD,GACEC,IAAetE,GACf,IAAIjE,OACF,IAAM/B,EAAYsK,GAAYpK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKuH,GAEP,OAAOtK,GAEX,OAAOC,EA8XH4O,CAAavE,GAQjB,MAFY,QAARQ,IAAkBlK,EAAIkO,OAAMxE,GAAQ1J,EAAIkO,KAAK7J,MAAM,KAAK,IAErDqF,EAPLzK,EAAKuB,EAAiB,YAAckJ,IAmDpCyE,GAAW,SACbC,EACAC,EACAvH,EACAwH,IAEKA,GAAe7H,GAAWK,KAAWwH,EAAcxH,GACxD,IACIyH,EAGEC,EAJFnG,EAAW5B,GAAW6H,GAAeA,EAAc,aAEnD9K,EAAS6K,KAAgD,EAA9BA,EAAc1G,QAAQ,OAGnD0G,GADIG,EAAQH,EAAchK,MAAM,MACVoK,QACtBF,EAAc,IAAMC,EAAMxG,KAAK,MAGjC,IAAI0B,EAAOgD,GAAQ2B,GAUnB,IARK3E,GAAkB,IAAVzH,GAAekD,KAE1BoD,GAAQoD,QAAUH,GAAqB5F,KAAS1G,EAC5CqJ,GAAQqD,aAAezG,KAAYoD,GAAQqD,WAAahG,MAC5DT,GAAajG,GAIVwK,GAAQwC,IAAgBxC,EAA7B,CAEAwC,GAAexC,EACflB,GAAKkB,KAAOA,EAGRpE,GAAsB,OACxBkD,GAAKkG,eACHnI,KAAKwG,IAAI3L,EAA2B,aAAK,EAAGvC,EAAO8P,YAAc,IACjE,KACFnG,GAAKoG,gBACHrI,KAAKwG,IACH3L,EAAgBQ,IAAiB,EACjC/C,EAAOgQ,aAAe,IACnB,MAILvJ,GAAsB,MACpBxF,EAAIuB,KAAWmH,GAAKnH,GAAYvB,EAAIuB,IAItCe,GAAUkD,GAAsB,QAClCkD,GAAKsG,aAAe1M,EAAO2M,MAC3BvG,GAAKwG,cAAgB5M,EAAOmL,QAI9B,IAII0B,EAJAC,EAAOrQ,EAAOsQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG3F,KAC/D,MAAOvG,IACPjE,EAAKiE,IAGP0K,GAAgBqB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBtH,QAAQsH,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGzH,QAAQuH,EAAKE,GAAgB3F,MAGxC,IAAI6F,EAA0BjD,GAC1BA,GAAShI,MApwBH,KAowBgB,GACtBnF,EACJyO,GAAWtB,IACgD,EAAvD5B,GAAmB9C,QAAQ2H,IAC3BA,GAA2BpP,EAC3Bb,EAGJmJ,GAAK+G,OACH,QAAQpN,KAAKiK,OAAkBgC,GAAeR,GAC1CvO,GACCsO,GAEP7G,EAAWD,GAAeC,EAAU,CAClC2C,KAAMjK,EACNkK,KAAMlB,GAAKkB,OAGb,IAAI8F,EAAsB,WACxB/O,EAA2BrB,EAC3B,IAAIqQ,EACFrB,GAAeR,KAAkBtI,GAAsB,MAvI1C,SACjB8I,EACAsB,EACA/B,EACAnG,EACAV,EACAuB,GAEI+F,GAAa7B,GAAY,GAAKhE,GAAQoD,QAASvM,GACnD,IAAIuQ,EAAuB,IAAV1N,EAAckD,GAAajG,EAC5CqJ,GAAQoD,QACNgE,IAAenE,GAAqB5F,KAAS1G,GAE/C,IAAI0Q,EAAcxG,GAAkBsD,KAChCmD,EAAQzI,GAAesI,EAAkBlI,GAE7CY,GACE,CACEoE,GAAIjE,GAAQoD,QACZiB,YAAa+C,EACblG,KAAMkG,EAAa,SAAWnQ,EAC9B6M,UAAWqD,GAAoB/B,EAAWtB,GAAW,KACrDwD,MAAOA,EACPzK,EAAGA,GAEH0B,SAAUhG,EAAUgG,IAEtBuB,GAGFqF,GAAmBrB,GACnBA,GAAWuD,EAEX3N,IAuGE6N,CACE1B,EACAqB,EACA9B,GACAY,EACAzH,EACAuB,IAIJ,GAAK5H,EAmBH+O,SAjBA,IACMhO,GAAUiF,GAAWjF,EAAOuO,sBAC9BvO,EACGuO,qBAAqB,CAACjO,EAAcC,IACpCiO,KAAK,SAAUC,GACd1H,GAAQ2H,QAAUD,EAAkBnO,GACpCyG,GAAQ4H,WAAaF,EAAkBlO,GACvCyN,MAEDY,SAAMZ,GAETA,IAEF,MAAOrC,GACPqC,OAWFa,GAAMxR,EAAOyR,QACbC,GAAeF,GAAMA,GAAIG,UAAYtR,EACrCuR,GAAM5R,EAAO6R,cACbC,GAAgB,YAIhBtG,IAAekG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB5G,GAoBAkH,IAlBrB,WACL,IAEI/G,EAFAjF,EAAMhC,UACNmO,EAAKD,GAAK9N,MAAMgO,KAAMpM,GAY1B,OAVI8B,GAAWmK,OACbhH,EAAQ,IAAIgH,MAAMnH,KAIlBG,EAAQxJ,EAAI4Q,YAAY,UAClBC,UAAUxH,GAAMrK,EAASA,GAEjCwK,EAAMjH,UAAYgC,EAClB8L,GAAI7G,GACGkH,IAMX9P,EACE2P,GACA,WACExC,GAAS,IAEX9O,GAGF2B,EACE,WACA,WACEmN,GAAS,IAEX9O,IAKAgL,IAAuB,QAARH,IAAkB,iBAAkBrL,GACrDmC,EACE,aACA,WACEmN,GAAS,IAEX9O,GAIAgL,IAAa8D,KAEjBtP,EAAOqS,YAAc,SAAUxH,EAAM5C,EAAUuB,GAC7C8F,GAAS,EAAGzE,EAAM5C,EAAUuB,IAQ9B,IAAI8I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUxH,EAAO9C,EAAUwH,IACpCA,GAAe7H,GAAWK,KAAWwH,EAAcxH,GAExD,IAAIuK,EAAkB5K,GAAWmD,GAC7BvB,EAAW5B,GAAW6H,GAAeA,EAAc,aACnDgD,SAAmB1H,EAEvB,GAAIuH,GAAWxJ,QAAQ2J,GAAa,IAAMD,EAExC,OADArO,EAAesH,GAAmB7K,EAAY,aAAe6R,GACtDjJ,IAGT,IACE,GAAIgJ,EAAiB,CACnB,IAAIE,EAAc3H,IAClB,GAAIuH,GAAWxJ,eAAe4J,GAAe,EAK3C,OAJAvO,EACEsH,GACAV,EAAQ,uBAAyB2H,GAE5BlJ,IAETuB,EAAQ2H,GAEV,MAAOrO,IAEP,OADAF,EAAesH,GAAmBpH,IAC3BmF,IAGTuB,GAAS,GAAKA,GAAOhG,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAI4N,EAAc,CAAE/H,KAAMhK,EAAWmK,MAAOA,GACxC6H,GAAa7D,IAAiB3L,EAAQ,EAGtCkD,IAAwB,IAAVlD,IAAgByK,OAChC8E,EAAY7F,QAAUzM,EACtBsS,EAAY5F,WAAa1M,GAG3B4H,EAAWD,GAAeC,EAAU0K,GAEhC5H,GACFxB,GACE3D,EAAO+M,EAAa,CAClBhF,GAAI5G,KACJiK,MAAOzI,IAAgBqK,GACvBpF,UACGoF,GAAa9D,KAAarI,GAAsB,KAC7CoI,GACA,KAEN5G,SAAUhG,EAAUgG,KAEtBuB,IAKFqJ,GAAmB,SAAU9H,EAAO9C,EAAUuB,GAChD+I,GAAUxH,EAAO9C,EAAUuB,IAIxBxJ,EAAOyL,MACVzL,EAAOyL,IAAqBoH,IAE9B,IAAIC,GAAY9S,EAAOyL,IAGnBsH,GAAQD,IAAaA,GAAUpK,EAAIoK,GAAUpK,EAAI,GAMrD,IAAK,IAAIqC,MAHT/K,EAAOyL,IAAqBoH,GAGVE,GACZzO,EAAQyO,GAAOhI,MACjB1F,MAAMC,QAAQyN,GAAMhI,KAChBwH,GAAUrO,MAAM,KAAM6O,GAAMhI,KAC5BwH,GAAUQ,GAAMhI,MAGxB,MAAOuD,IACPnO,EAAUmO,IAnJY,IAAU1D,GACxBoH,GAnoBkBzG,GA/N9B,CAu/BEvL,OACA,uBACA"} \ No newline at end of file +{"version":3,"file":"hello.source.js","sources":["hello.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAAaC,iBAA0BpC,EACvCqC,EAAkBhB,EAAIgB,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAAS1B,EAAI2B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK7B,KAAe,WAAW6B,KAAK7B,GACxD8B,EAASvD,EAAOuD,OAIhBC,EACFjC,EAAIkC,eAAiBlC,EAAImC,cAAc,gBAAkBxD,EAAU,MAOrEE,EAAO,WAEL,IAAIuD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK/C,EAAIV,KAAMU,EAAK6C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnCjE,EAAK,iBAAmBgE,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWlG,EAAOmG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKpG,GAAkBsF,OAG5DtF,EAAmB2F,EAAO3F,EAAkBiG,GAExCE,GAAahG,EAAK,WAAYH,GAGlC,IAAIqG,GACFrG,EAAiBqG,YAActB,EAAKxB,EAAe,gBAE7B,iBAAf8C,IACN,yEAAyEhD,KACxEgD,MAGFA,GAAajG,GAIf,IA+EIkG,GA/EAC,GAAgBrB,EAClBlF,EAAiBuG,eAAiBxB,EAAKxB,EAAe,mBAGpDiD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU7B,GAC7B,OAAO,IAAI8B,OAAO,IAAMF,GAAoBpD,KAAKwB,KAChDS,QAIHsB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAehH,EAAOiH,QAAUjH,EAAOkH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOnD,GACP,OAAO8C,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF9H,EAAiB6H,KACjB9C,EAAKxB,EAAesE,KAqzBxB,KAlzBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBnI,EAAO+H,GAAY,aACpCtC,EAAS0C,KAAiBF,EAAWrC,EAAOqC,EAAUE,IAC1D,IAAIC,EAA4BpI,EAAOqI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACFjI,EACEiI,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOrC,EACLqC,EACAG,EAA0BvE,KAAK7D,EAAQ4F,EAAOqC,EAAUC,KAE1D,MAAO7D,GACPF,EAAe,WAAYE,KAU3BiE,GACFrI,EAAiBqI,WACjBtD,EAAKxB,EAAe,eAAiB/C,EAInC8H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAKjG,EACvD,IAAIkI,GAAKD,GAAmBtH,EAAIwH,QAC7B/E,MAAM,GACN4B,MAAM,KACNmB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM/F,GAAgB,EAAJqI,GAASD,EAAShF,MAAMiF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAShF,MAAM,EAAGiF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIrE,GAAasE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAY1D,OAAe/E,EAInC,IAAIoG,OAAOwC,EAAO,KAAK9F,KAAKsF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKlG,EACFqI,GAAKrI,GA+BVgJ,GAAiBtB,GAAY,UACjC,GAAI/H,EAAOqJ,KAAmB9I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOsJ,gBAAkB/I,EACzBP,EAAOqJ,IAAkB9I,EAOzB,IAAIgJ,GAAW,SAAUrB,EAAMsB,EAAUC,GACvCvB,EAAOuB,EAAevB,EAAOtC,EAAO8D,GAASC,GAAMzB,GAE/CjH,EAAI2I,QAAUH,IAAcvB,EAAK0B,MAAQrJ,GACzCU,EAAI4I,qBAAuBJ,IAAcvB,EAAK4B,KAAOvJ,GAGzD,IAAIwJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJ9H,EACA,eACAoC,OAAO4B,KAAK6B,GACTvB,OAAO,SAAUyD,GAChB,OAAOlC,EAAKkC,IAAQ/J,IAErB6I,IAAI,SAAUkB,GACb,OACEvI,EAAuBuI,GACvB,IACAvI,EAAuBqG,EAAKkC,MAG/BjB,KAAK,KACR,SACArC,KAAKD,OAILwD,GACFpK,EAAiBqK,UAAYtF,EAAKxB,EAAe,YAC/C+G,GAAkBF,IAAuBhJ,EAEzCmJ,GAAc,CAChBC,QAmqBJ,eAlqBIH,SAAUC,IASZpK,EAAY,SAAUuK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJtK,EAAKsK,GACLnB,GACE3D,EAAO4E,GAAa,CAClBI,KAAM/J,EACNwD,MAAOqG,EACPG,KAAM1J,EAAI2J,WAEZzK,EACAE,IAMJ4B,EACEtB,EACA,SAAUkK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASlC,QAAQ5I,IAC3CC,EAAU4K,EAAME,UAGpBzK,GAOF,IAwDI0K,GAxDAC,GAAQtE,KAERuE,GAAW,EAOXC,GAAOpL,EAAiBoL,MAAQrG,EAAKxB,EAAe,QAGpD8H,MA/KsBC,GA+KCtL,EAAiBqL,cA9KvBC,GA+KjBtL,EAAiBqL,WACjBtG,EAAKxB,EAAe,eAAiB/C,GACrCuE,EAAKxB,EAAe,aAAe/C,GACnCuE,EAAKxB,EAAe,gBAAkB/C,EAGtC+K,KACqC,SAAvCxG,EAAKxB,EAAe,iBACpBvD,EAAiBuL,cAAgBhL,GAI/BiL,GACFxL,EAAiByL,UACjB1G,EAAKxB,EAAe,cACpBuE,GAAY,IAAMnH,EAGhB+K,GAAcxG,EAChBlF,EAAiB0L,aAAe3G,EAAKxB,EAAe,iBAIlDyF,GAAc9D,EAChBlF,EAAiBgJ,aAAejE,EAAKxB,EAAe,iBAIlDoI,GAAqBzG,EACvBlF,EAAiB2L,oBACf5G,EAAKxB,EAAe,yBAIpBqI,GACF5L,EAAiB4L,gBAAkB7G,EAAKxB,EAAe,mBAGrD6E,GACFpI,EAAiBoI,mBACjBrD,EAAKxB,EAAe,sBAItB,IAEE0H,GAAWzE,GAAsB,KAC7BqF,KAAKC,iBAAiBC,kBAAkBC,SACxC5L,EACJ,MAAOgE,IACPjE,EAAKiE,IAOP,IAAI6H,GAAUlM,EAAOkM,QACjBC,GACFlL,EAAImL,WACJpM,EAAOqM,aACPrM,EAAOsM,aACPtM,EAAOuM,UACNL,KAAYA,GAAQM,QACrBxM,EAAOyM,YACPzM,EAAO0M,MACPrJ,GACAqE,KAAKC,UAAYD,KAAKC,SAGpBgF,GACFlG,GAAsB,MAAQA,GAAsB,QAElD0F,KAAK3B,GAAY2B,IAAM5L,GAE3B,IAAImJ,GAAU9D,EAAO4E,GAAa,CAEhCoC,GAAInG,GAAsB,MAAQhF,EAAYpB,EAE9CK,MAAOS,EAAImB,UAAY5B,EACvBwK,SAAUA,GACV2B,sBAAuBtM,EACvBuM,QAASxG,KAAeqG,GAAqB5F,KAAS1G,GAGtD0M,WAAYtG,GAAsB,MAC9BH,IAAcS,KACd1G,IA0BN,GAvBAqJ,GAAQsD,IAAMxM,EAIVmC,IACF+G,GAAQuD,OAAStK,EAAOsK,OACxBvD,GAAQwD,OAASjL,EAAUU,EAAOuK,SAS/B3L,EAAI4L,SAAS/M,EAAK,4CAInBmK,KAAoBlJ,IACtBqI,GAAQ0D,kBAAoB/L,IAGzBiK,IAActK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBmC,EAAU,SAK7B,GAAlC9B,EAAiByH,QAAQ,OACxB,aAAaxF,KAAKjC,IACnBgJ,IAEDjK,EACE,mBACEiB,EACA,SACA8B,EACA,0BAON,IACIkK,GA2DAC,GA5DA3D,GAAO,GAGP4D,GAAc,WAKhB,OAFEtN,EAAiBuN,UAAYxI,EAAKxB,EAAe,aAGzBjC,EAAIiM,UAAY,IACrCzI,QAAQ1D,EAAkBkJ,IAC1BxF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS1E,GAKjCmN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKjB,MACDrG,IAAe+G,IAAiBQ,MAApC,CAEA,IAAIC,EAASlI,EAAO4E,GAAa,CAC/BI,KAAM,SACNmD,YAAaH,EAAOD,EAAKjE,GAAQoD,UAenC,GAXIrG,GAAsB,OACxBqH,EAAOE,SAAWtG,KAAKuG,OAAOpH,KAAQsE,GAAQsC,IAnhBnC,MAqhBbA,GAAW,EACXtC,GAAQtE,KAGJJ,GAAsB,UACxBqH,EAAO1C,SAAW1D,KAAKwG,IAAI,EAAG9C,GAAU+C,OAGtCP,IAAS3M,EAAImN,WAEf7E,GAASuE,EAAQzN,EAAcE,QAE/B,IACEU,EAAImN,WAAWC,KAAKpN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU6L,IAC3D,MAAOQ,GAEP/E,GAASuE,EAAQzN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAIgN,QACA,KAAOvL,KAAYhD,GAAS0N,KAClCJ,GAAczG,MACT4G,IAAY5G,KAAQyG,IAE7B9M,GAGF2B,EAAqBa,EAAU0K,GAAalN,GAE5C,IAAIgO,GAAOjN,EAAIiN,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuBlM,EAAgBQ,IAAiB,EACxD2L,EAAShH,KAAKwG,IAChBM,GAAK3L,IAAiB,EACtB2L,GAAK1L,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO4E,KAAKiH,IACV,IAKI,EAJJjH,KAAKuG,MACF,MAAQ1L,EAAgBqM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOrK,IAEP,OADAjE,EAAKiE,IACE,IAIXlC,EAAqB,OAAQ,WAC3BiJ,GAAW+C,KACXhM,EACEO,EACA,WACM0I,GAAW+C,OAAY/C,GAAW+C,OAExC3N,KAQJ,IAgCIqO,GAuCAC,GAAUC,GAvEVlB,GAAU,SAAUmB,GACtB,IAAInE,EAAO,GAIX,IACEA,EAAOmE,GAAajN,EAAuBZ,EAAI2J,UAC/C,MAAOzG,IACPjE,EAAKiE,IAGP,IAAI4K,EAAyBjP,EAAO6L,IACpC,GAAIjE,GAAWqH,GACb,IACEpE,EAAOoE,EAAuBpL,KAAK7D,EAAQ,CAAE6K,KAAMA,KAAWA,EAC9D,MAAOxG,IACPF,EAAe,OAAQE,IAK3B,IAhZiB,SAAUwG,GAC3B,IAAK,IAAIhC,KAAK8C,GAAa,CACzB,IAAIuD,EAAgBvD,GAAY9C,GAChC,GAAKqG,EAAL,CAGA,IAAIC,EA1PI,KA2PND,EAAc,GAAcA,EA3PtB,IA2P8CA,EAEtD,GACEC,IAAetE,GACf,IAAIjE,OACF,IAAM/B,EAAYsK,GAAYpK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKuH,GAEP,OAAOtK,GAEX,OAAOC,EA8XH4O,CAAavE,GAQjB,MAFY,QAARQ,IAAkBlK,EAAIkO,OAAMxE,GAAQ1J,EAAIkO,KAAK7J,MAAM,KAAK,IAErDqF,EAPLzK,EAAKuB,EAAiB,YAAckJ,IAmDpCyE,GAAW,SACbC,EACAC,EACAvH,EACAwH,IAEKA,GAAe7H,GAAWK,KAAWwH,EAAcxH,GACxD,IACIyH,EAGEC,EAJFnG,EAAW5B,GAAW6H,GAAeA,EAAc,aAEnD9K,EAAS6K,KAAgD,EAA9BA,EAAc1G,QAAQ,OAGnD0G,GADIG,EAAQH,EAAchK,MAAM,MACVoK,QACtBF,EAAc,IAAMC,EAAMxG,KAAK,MAGjC,IAAI0B,EAAOgD,GAAQ2B,GAUnB,GARK3E,GAASwC,KAAgB/G,KAE5BoD,GAAQoD,QAAUH,GAAqB5F,KAAS1G,EAC5CqJ,GAAQqD,aAAezG,KAAYoD,GAAQqD,WAAahG,MAC5DT,GAAajG,GAIVwK,GAAQwC,IAAgBxC,EAA7B,CAEAwC,GAAexC,EACflB,GAAKkB,KAAOA,EAGRpE,GAAsB,OACxBkD,GAAKkG,eACHnI,KAAKwG,IAAI3L,EAA2B,aAAK,EAAGvC,EAAO8P,YAAc,IACjE,KACFnG,GAAKoG,gBACHrI,KAAKwG,IACH3L,EAAgBQ,IAAiB,EACjC/C,EAAOgQ,aAAe,IACnB,MAILvJ,GAAsB,MACpBxF,EAAIuB,KAAWmH,GAAKnH,GAAYvB,EAAIuB,IAItCe,GAAUkD,GAAsB,QAClCkD,GAAKsG,aAAe1M,EAAO2M,MAC3BvG,GAAKwG,cAAgB5M,EAAOmL,QAI9B,IAII0B,EAJAC,EAAOrQ,EAAOsQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG3F,KAC/D,MAAOvG,IACPjE,EAAKiE,IAGP0K,GAAgBqB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBtH,QAAQsH,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGzH,QAAQuH,EAAKE,GAAgB3F,MAGxC,IAAI6F,EAA0BjD,GAC1BA,GAAShI,MApwBH,KAowBgB,GACtBnF,EACJyO,GAAWtB,IACgD,EAAvD5B,GAAmB9C,QAAQ2H,IAC3BA,GAA2BpP,EAC3Bb,EAGJmJ,GAAK+G,OACH,QAAQpN,KAAKiK,OAAkBgC,GAAeR,GAC1CvO,GACCsO,GAEP7G,EAAWD,GAAeC,EAAU,CAClC2C,KAAMjK,EACNkK,KAAMlB,GAAKkB,OAGb,IAAI8F,EAAsB,WACxB/O,EAA2BrB,EAC3B,IAAIqQ,EACFrB,GAAeR,KAAkBtI,GAAsB,MAvI1C,SACjB8I,EACAsB,EACA/B,EACAnG,EACAV,EACAuB,GAEI+F,GAAa7B,GAAY,GAAKhE,GAAQoD,QAASvM,GACnD,IAAIuQ,EAAuB,IAAV1N,EAAckD,GAAajG,EAC5CqJ,GAAQoD,QACNgE,IAAenE,GAAqB5F,KAAS1G,GAE/C,IAAI0Q,EAAcxG,GAAkBsD,KAChCmD,EAAQzI,GAAesI,EAAkBlI,GAE7CY,GACE,CACEoE,GAAIjE,GAAQoD,QACZiB,YAAa+C,EACblG,KAAMkG,EAAa,SAAWnQ,EAC9B6M,UAAWqD,GAAoB/B,EAAWtB,GAAW,KACrDwD,MAAOA,EACPzK,EAAGA,GAEH0B,SAAUhG,EAAUgG,IAEtBuB,GAGFqF,GAAmBrB,GACnBA,GAAWuD,EAEX3N,IAuGE6N,CACE1B,EACAqB,EACA9B,GACAY,EACAzH,EACAuB,IAIJ,GAAK5H,EAmBH+O,SAjBA,IACMhO,GAAUiF,GAAWjF,EAAOuO,sBAC9BvO,EACGuO,qBAAqB,CAACjO,EAAcC,IACpCiO,KAAK,SAAUC,GACd1H,GAAQ2H,QAAUD,EAAkBnO,GACpCyG,GAAQ4H,WAAaF,EAAkBlO,GACvCyN,MAEDY,SAAMZ,GAETA,IAEF,MAAOrC,GACPqC,OAWFa,GAAMxR,EAAOyR,QACbC,GAAeF,GAAMA,GAAIG,UAAYtR,EACrCuR,GAAM5R,EAAO6R,cACbC,GAAgB,YAIhBtG,IAAekG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB5G,GAoBAkH,IAlBrB,WACL,IAEI/G,EAFAjF,EAAMhC,UACNmO,EAAKD,GAAK9N,MAAMgO,KAAMpM,GAY1B,OAVI8B,GAAWmK,OACbhH,EAAQ,IAAIgH,MAAMnH,KAIlBG,EAAQxJ,EAAI4Q,YAAY,UAClBC,UAAUxH,GAAMrK,EAASA,GAEjCwK,EAAMjH,UAAYgC,EAClB8L,GAAI7G,GACGkH,IAMX9P,EACE2P,GACA,WACExC,GAAS,IAEX9O,GAGF2B,EACE,WACA,WACEmN,GAAS,IAEX9O,IAKAgL,IAAuB,QAARH,IAAkB,iBAAkBrL,GACrDmC,EACE,aACA,WACEmN,GAAS,IAEX9O,GAIAgL,IAAa8D,KAEjBtP,EAAOqS,YAAc,SAAUxH,EAAM5C,EAAUuB,GAC7C8F,GAAS,EAAGzE,EAAM5C,EAAUuB,IAQ9B,IAAI8I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUxH,EAAO9C,EAAUwH,IACpCA,GAAe7H,GAAWK,KAAWwH,EAAcxH,GAExD,IAAIuK,EAAkB5K,GAAWmD,GAC7BvB,EAAW5B,GAAW6H,GAAeA,EAAc,aACnDgD,SAAmB1H,EAEvB,GAAIuH,GAAWxJ,QAAQ2J,GAAa,IAAMD,EAExC,OADArO,EAAesH,GAAmB7K,EAAY,aAAe6R,GACtDjJ,IAGT,IACE,GAAIgJ,EAAiB,CACnB,IAAIE,EAAc3H,IAClB,GAAIuH,GAAWxJ,eAAe4J,GAAe,EAK3C,OAJAvO,EACEsH,GACAV,EAAQ,uBAAyB2H,GAE5BlJ,IAETuB,EAAQ2H,GAEV,MAAOrO,IAEP,OADAF,EAAesH,GAAmBpH,IAC3BmF,IAGTuB,GAAS,GAAKA,GAAOhG,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAI4N,EAAc,CAAE/H,KAAMhK,EAAWmK,MAAOA,GACxC6H,GAAa7D,IAAiB3L,EAAQ,GAGtCkD,IAAe+G,IAAiBQ,OAClC8E,EAAY7F,QAAUzM,EACtBsS,EAAY5F,WAAa1M,GAG3B4H,EAAWD,GAAeC,EAAU0K,GAEhC5H,GACFxB,GACE3D,EAAO+M,EAAa,CAClBhF,GAAI5G,KACJiK,MAAOzI,IAAgBqK,GACvBpF,UACGoF,GAAa9D,KAAarI,GAAsB,KAC7CoI,GACA,KAEN5G,SAAUhG,EAAUgG,KAEtBuB,IAKFqJ,GAAmB,SAAU9H,EAAO9C,EAAUuB,GAChD+I,GAAUxH,EAAO9C,EAAUuB,IAIxBxJ,EAAOyL,MACVzL,EAAOyL,IAAqBoH,IAE9B,IAAIC,GAAY9S,EAAOyL,IAGnBsH,GAAQD,IAAaA,GAAUpK,EAAIoK,GAAUpK,EAAI,GAMrD,IAAK,IAAIqC,MAHT/K,EAAOyL,IAAqBoH,GAGVE,GACZzO,EAAQyO,GAAOhI,MACjB1F,MAAMC,QAAQyN,GAAMhI,KAChBwH,GAAUrO,MAAM,KAAM6O,GAAMhI,KAC5BwH,GAAUQ,GAAMhI,MAGxB,MAAOuD,IACPnO,EAAUmO,IAnJY,IAAU1D,GACxBoH,GAnoBkBzG,GA/N9B,CAu/BEvL,OACA,uBACA"} \ No newline at end of file diff --git a/dist/latest/latest.dev.js b/dist/latest/latest.dev.js index 8491042..1f841e8 100644 --- a/dist/latest/latest.dev.js +++ b/dist/latest/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 9573; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; a763; v12) */ /* eslint-env browser */ (function ( @@ -566,7 +566,7 @@ var sendOnLeave = function (id, push) { if (!collectDataOnLeave) return; - if (pageLoadId && pages === 0 && !getPath()) return; + if (pageLoadId && !lastSendPath && !getPath()) return; var append = assign(basePayload, { type: "append", @@ -743,7 +743,7 @@ // Obfuscate personal data in URL by dropping the search and hash var path = getPath(pathOverwrite); - if (!path && pages === 0 && pageLoadId) { + if (!path && !lastSendPath && pageLoadId) { // An ignored initial page must not receive event or leave enrichment. payload.page_id = collectDataOnLeave ? uuid() : undefinedVar; if (payload.session_id === pageLoadId) payload.session_id = uuid(); @@ -966,7 +966,7 @@ var firstPage = !userNavigated && pages < 2; // Manual collection may not have declared an allowed pageview yet. - if (pageLoadId && pages === 0 && !getPath()) { + if (pageLoadId && !lastSendPath && !getPath()) { eventParams.page_id = undefinedVar; eventParams.session_id = undefinedVar; } diff --git a/dist/latest/latest.js b/dist/latest/latest.js index d6c96fa..c864cb9 100644 --- a/dist/latest/latest.js +++ b/dist/latest/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 60e7; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; f5af; v12) */ -!function(h,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,q="https://queue."+e,M=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[Mt];if(!ot(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[Mt];if(!ot(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && pages === 0 && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && pages === 0 && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/light.js b/dist/latest/light.js index c753bb3..c7d2024 100644 --- a/dist/latest/light.js +++ b/dist/latest/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 278c; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; f045; v12) */ -!function(l,e,t,f){try{var m=undefined,n="https:",r=l.console,a="doNotTrack",g=l.navigator,d=l.location,h=d.host,i=l.document,o=g.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,p=decodeURIComponent,u=JSON.stringify,y=l.addEventListener,_="https://queue."+t,b=(i.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,E=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),$=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||x($,V)||"sa",C=e.strictUtm||"true"==x($,"strict-utm"),T=B+"_loaded";if(1==l[T])return f(c+"twice");l.sa_event_loaded=!0,l[T]=!0;var F,H=function(t,e,n){t=n?t:A(M,Z,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||x($,"hostname"),z=L||h,J={version:"cdn_light_12",hostname:z};e.mode||x($,"mode");try{F=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}E&&(J.bot=!0);var M=A(J,{ua:o,https:d.protocol==n,timezone:F,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!1,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==h&&(M.hostname_original=h),a in g&&"1"==g[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||L||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||x($,"referrer")||i.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,K=function(e,t){if(0,!N||0!==k||X()){var n=A(J,{type:"append",original_id:t?e:M.page_id});if(t||!g.sendBeacon)H(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",u(n))}catch(r){H(n,0,!0)}}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:m;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||m);H({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);q(t)&&-1>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||x($,V)||"sa",C=e.strictUtm||"true"==x($,"strict-utm"),T=B+"_loaded";if(1==l[T])return f(c+"twice");l.sa_event_loaded=!0,l[T]=!0;var F,H=function(t,e,n){t=n?t:A(M,Z,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||x($,"hostname"),z=L||h,J={version:"cdn_light_12",hostname:z};e.mode||x($,"mode");try{F=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}E&&(J.bot=!0);var M=A(J,{ua:o,https:d.protocol==n,timezone:F,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!1,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==h&&(M.hostname_original=h),a in g&&"1"==g[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||L||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||x($,"referrer")||i.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,K=function(e,t){if(0,!N||P||X()){var n=A(J,{type:"append",original_id:t?e:M.page_id});if(t||!g.sendBeacon)H(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",u(n))}catch(r){H(n,0,!0)}}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:m;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||m);H({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);q(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && pages === 0 && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAKAC,GAEA,IAQE,IAAIC,EAAeC,UAIfC,EAAQ,SAKRC,EAAMP,EAAOQ,QACbC,EAAa,aACbC,EAAMV,EAAOW,UACbC,EAAMZ,EAAOa,SACbC,EAAmBF,EAAIG,KACvBC,EAAMhB,EAAOiB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBAEbC,GAhBW,EAiBXC,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuB3B,EAAO4B,iBAC9BC,EAAaC,iBAA0B5B,EAEvC6B,GADkBf,EAAIgB,gBACX,YAIXC,EAASvB,EAAIwB,cAMbC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAKtB,KAAe,WAAWsB,KAAKtB,GAIxDuB,EACFzB,EAAI0B,eAAiB1B,EAAI2B,cAAc,gBAAkBzC,EAAU,MAOrEC,EAAO,WAEL,IAAIyC,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAKvC,EAAIJ,KAAMI,EAAKqC,IAGtD,IAQIQ,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAOZC,EAAO,SAAUb,EAAec,GAClC,OAAOd,GAAiBA,EAAce,aAAa,QAAUD,IAe3DE,EAAS,WAGX,IAFA,IA7BsBC,EAAKC,EAwBJC,EAKnBC,EAAK,GACLC,EAAMf,UACDgB,EAAQ,EAAGA,EAAQD,EAAIE,OAAQD,IAAS,CAC/C,IAAIE,EAAaH,EAAIC,GACrB,IATqBH,EASRK,IAREL,EAAOM,cAAgBC,OASpC,IAAK,IAAIC,KAAWH,EAlCFP,EAmCJO,EAnCSN,EAmCGS,EAlCvBD,OAAOjB,UAAUmB,eAAevB,KAAKY,EAAKC,KAmCzCE,EAAGO,GAAWH,EAAWG,IAKjC,OAAOP,GAGLS,EAAWtE,EAAOuE,YAClBC,EAAcF,GAAYH,OAAOM,KAAKxE,GAAkB+D,OAG5D/D,EAAmBwD,EAAOxD,EAAkBqE,GAExCE,GAAarE,EAAK,WAAYF,GAGlC,IAAIyE,EACFzE,EAAiByE,YAAcpB,EAAKb,EAAe,gBAE7B,iBAAfiC,GACN,yEAAyElC,KACxEkC,KAGFA,EAAatE,GASLuE,KAAKC,IALf,IAOIC,EAAO,WACT,IAAIC,EAAe9E,EAAO+E,QAAU/E,EAAOgF,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,OACEA,EACCN,EAAaO,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOC,GACP,OAAOP,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,IAAIK,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMP,EAAI,EAAIK,EAAS,EAAJA,EAAW,GACrBF,SAAS,QAKpBK,EAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,EAAgB,YAChBC,EACF9F,EAAiB6F,IACjBxC,EAAKb,EAAeqD,IA6axB,KAnaME,EACF/F,EAAiB+F,WAnLJ,QAoLb1C,EAAKb,EAAe,cAoClBwD,EAAiBF,EAAY,UACjC,GA3Nc,GA2NV/F,EAAOiG,GAA4B,OAAO9F,EAAKgB,EAAa,SAChEnB,EAAOkG,iBA5NO,EA6NdlG,EAAOiG,IA7NO,EAoOd,IA4DIE,EA5DAC,EAAW,SAAUC,EAAMC,EAAUC,GACvCF,EAAOE,EAAeF,EAAO5C,EAAO+C,EAASC,EAAMJ,GAE/C3F,EAAIgG,QAAUH,IAAcF,EAAKK,OAvOzB,GAwORhG,EAAIiG,qBAAuBJ,IAAcF,EAAKO,MAxOtC,IA2OA,IAAIC,OACVC,IACJjF,EACA,eACAsC,OAAOM,KAAK4B,GACTU,OAAO,SAAUC,GAChB,OAAOX,EAAKW,IAAQ5G,IAErB6G,IAAI,SAAUD,GACb,OACE3F,EAAuB2F,GACvB,IACA3F,EAAuBgF,EAAKW,MAG/BE,KAAK,KACR,SACAvC,KAAKC,OAILuC,EACFlH,EAAiBmH,UAAY9D,EAAKb,EAAe,YAC/C4E,EAAkBF,GAAuBrG,EAEzCwG,EAAc,CAChBC,QAiVJ,eAhVIH,SAAUC,GAeDpH,EAAiBuH,MAAQlE,EAAKb,EAAe,QAYxD,IAEE0D,EACIsB,KAAKC,iBAAiBC,kBAAkBC,SAE5C,MAAOpC,IACPrF,EAAKqF,IAQGjD,IAMD+E,EAAYO,KArTP,GAuTd,IAAIrB,EAAU/C,EAAO6D,EAAa,CAEhCQ,GAAkC5G,EAElCZ,MAAOM,EAAIkB,UAAYxB,EACvB6F,SAAUA,EACV4B,uBA7TY,EA8TZC,QAAStD,GAAoCG,IAG7CoD,WACIvD,GAAcG,MAyBpB,GArBA2B,EAAQ0B,KArUO,EAyUXjG,IACFuE,EAAQ2B,OAASlG,EAAOkG,OACxB3B,EAAQ4B,OAAS3G,EAAUQ,EAAOmG,SAWhCf,IAAoBvG,IACtB0F,EAAQ6B,kBAAoBvH,GAG1BL,KAAcC,GAA0B,KAAnBA,EAAID,GAC3B,OAAON,EA5UYgB,4BA6UAV,EAAa,oBAAsB4B,EAAU,SAK7B,GAAlCvB,EAAiBwH,QAAQ,OACxB,aAAa9F,KAAK1B,IACnBqG,GAEDhH,EACE,mBACEW,EACA,SACAuB,EACA,0BAON,IACIkG,EADA9B,EAAO,GAiBP+B,GAXAvI,EAAiBuI,UAAYlF,EAAKb,EAAe,aAGzBzB,EAAIwH,UAAY,IACrCrD,QAAQrE,EAAkBuG,GAC1BlC,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS/E,EAcjCqI,EAAc,SAAUC,EAAIC,GAE9B,GADI,GACAjE,GAAe6D,GAAiBK,IAApC,CAEA,IAAIC,EAASpF,EAAO6D,EAAa,CAC/BwB,KAAM,SACNC,YAAaJ,EAAOD,EAAKlC,EAAQwB,UAKnC,GAAIW,IAASjI,EAAIsI,WAEf5C,EAASyC,EAAQzI,GAzZP,QA2ZV,IACEM,EAAIsI,WAAWC,KAAKvI,EAApBA,CAAyBmB,EAAa,UAAWJ,EAAUoH,IAC3D,MAAOK,GAEP9C,EAASyC,EAAQzI,GA/ZT,MAqaduB,EAnYe,WAmYgB8G,GApahB,GA2af,IAsDIU,EAAUC,EAtDVR,EAAU,SAAUS,GACtB,IAAIC,EAAO,GAIX,IACEA,EAAOD,GAAa9H,EAAuBX,EAAI2I,UAC/C,MAAO/D,IACPrF,EAAKqF,IAMP,OAAO8D,GAMLE,EAAe,SACjBC,EACAC,EACAP,EACAQ,EACAC,EACAtD,GAEImD,GAAahB,EAAY,GAAKjC,EAAQwB,SAxc9B,GAycZ,IAAI6B,EAAuB,IAAVvH,EAAcoC,EAAatE,EAC5CoG,EAAQwB,QACN6B,GAAoChF,IAEtC,IApR6BiF,EAoRzBC,EAAc1C,EAAkBuB,IAChCoB,GArRyBF,EAqRFJ,GAAkBC,GApRjB/I,EAAI+I,QAC7B9G,MAAM,GACNoH,MAAM,KACNlD,OAAO,SAAUmD,GAIhB,OAFaJ,GAaN,IAAIK,OART,YACCnE,EAAY,GAAK,KAClB,yCACCA,EAAY,GAAK,QAClB,KAIuB,KAAKxD,KAAK0H,KAEpChD,KAAK,MAEI9G,GAgQZgG,EACE,CACEsC,GAAIlC,EAAQwB,QACZe,YAAac,EACbf,KAAMe,EAAa,SAhdN,WAidbrB,UAAWkB,GAAoBP,EAAWX,EAAW,KACrDwB,MAAOA,IAOXxB,EAAWuB,EAEXzH,MAKa,SACbmH,EACAW,EACAR,EACAS,IAEKA,GAAezE,EAAWgE,KAAWS,EAAcT,GACxD,IACIU,EAGEC,EAJS3E,EAAWyE,GAEtBjH,EAASgH,KAAgD,EAA9BA,EAAc9B,QAAQ,OAGnD8B,GADIG,EAAQH,EAAcH,MAAM,MACVO,QACtBF,EAAc,IAAMC,EAAMrD,KAAK,MAGjC,IAAIoC,EAAOV,EAAQwB,GAUnB,GARKd,GAASf,IAAgB7D,IAE5B8B,EAAQwB,QAA+BnD,IACnC2B,EAAQyB,aAAevD,IAAY8B,EAAQyB,WAAapD,KAC5DH,EAAatE,GAIVkJ,GAAQf,GAAgBe,EAA7B,CAEAf,EAAee,EACf7C,EAAK6C,KAAOA,EAKN5I,EAAIqB,KAAW0E,EAAK1E,GAAYrB,EAAIqB,IAK1C,IAII0I,EAJAC,EAAO1K,EAAO2K,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG9B,KAC/D,MAAOtD,IACPrF,EAAKqF,IAGP4D,EAAgBqB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBnC,QAAQmC,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGtC,QAAQoC,EAAKE,GAAgB9B,MAGxCK,IAAWX,GACPA,EAASyB,MA1hBH,KA0hBgB,IAAMnJ,EAKhC,IAAIgK,EAAsB,WACxB1J,GAtiBU,EAyiBVoI,EACEC,EAFAA,GAAeL,IAAiB,EAIhCD,EACAmB,IAMJ,GAAKlJ,EAmBH0J,SAjBA,IACM7I,GAAU2D,EAAW3D,EAAO8I,sBAC9B9I,EACG8I,qBAAqB,CAAC5I,EAAcC,IACpC4I,KAAK,SAAUC,GACdzE,EAAQ0E,QAAUD,EAAkB9I,GACpCqE,EAAQ2E,WAAaF,EAAkB7I,GACvC0I,MAEDM,SAAMN,GAETA,IAEF,MAAO5B,GACP4B,MASNO,GAEA,MAAOnC,IACP/I,EAAK+I,KAlmBT,CAqmBElJ,OACA,uBACA"} \ No newline at end of file diff --git a/dist/v12/app.js b/dist/v12/app.js index afa3244..04dfb96 100644 --- a/dist/v12/app.js +++ b/dist/v12/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 32f0; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; abdc; SRI-version; v12) */ -!function(h,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,q="https://queue."+e,M=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[Mt];if(!ot(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[Mt];if(!ot(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && pages === 0 && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && pages === 0 && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.js","sources":["app.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/app.js b/dist/v12/custom/app.js index ffac005..d757299 100644 --- a/dist/v12/custom/app.js +++ b/dist/v12/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 5e3e; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 3222; SRI-version; v12) */ -!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); +!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v12/custom/app.js.map b/dist/v12/custom/app.js.map index b8806ec..39ae97e 100644 --- a/dist/v12/custom/app.js.map +++ b/dist/v12/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && pages === 0 && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && pages === 0 && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/light.js b/dist/v12/custom/light.js index ce1800f..2d193ba 100644 --- a/dist/v12/custom/light.js +++ b/dist/v12/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 3bd9; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; d1f7; SRI-version; v12) */ -!function(l,e,t,f){try{var g=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,d=l.location,h=d.host,i=l.document,o=m.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,p=decodeURIComponent,u=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,x=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var $=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},I=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||A(E,V)||"sa",C=e.strictUtm||"true"==A(E,"strict-utm"),H=B+"_loaded";if(1==l[H])return f(c+"twice");l.sa_event_loaded=!0,l[H]=!0;var T,F=function(t,e,n){t=n?t:I(M,Z,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=g}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||A(E,"hostname"),z=L||h,J={version:"custom_light_12",hostname:z};e.mode||A(E,"mode");try{T=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}x&&(J.bot=!0);var M=I(J,{ua:o,https:d.protocol==n,timezone:T,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!0,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==h&&(M.hostname_original=h),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||L||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||A(E,"referrer")||i.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||g,K=function(e,t){if(0,!N||0!==k||X()){var n=I(J,{type:"append",original_id:t?e:M.page_id});if(t||!m.sendBeacon)F(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",u(n))}catch(r){F(n,0,!0)}}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:g;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||g);F({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);$(t)&&-1"); +!function(l,e,t,f){try{var g=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,d=l.location,h=d.host,i=l.document,o=m.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,p=decodeURIComponent,u=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,x=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var $=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},I=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||A(E,V)||"sa",C=e.strictUtm||"true"==A(E,"strict-utm"),H=B+"_loaded";if(1==l[H])return f(c+"twice");l.sa_event_loaded=!0,l[H]=!0;var T,F=function(t,e,n){t=n?t:I(M,Z,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=g}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||A(E,"hostname"),z=L||h,J={version:"custom_light_12",hostname:z};e.mode||A(E,"mode");try{T=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}x&&(J.bot=!0);var M=I(J,{ua:o,https:d.protocol==n,timezone:T,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!0,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==h&&(M.hostname_original=h),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||L||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||A(E,"referrer")||i.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||g,K=function(e,t){if(0,!N||P||X()){var n=I(J,{type:"append",original_id:t?e:M.page_id});if(t||!m.sendBeacon)F(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",u(n))}catch(r){F(n,0,!0)}}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:g;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||g);F({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);$(t)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v12/custom/light.js.map b/dist/v12/custom/light.js.map index ee76413..7f3aa47 100644 --- a/dist/v12/custom/light.js.map +++ b/dist/v12/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && pages === 0 && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/proxy.js b/dist/v12/custom/proxy.js index fcbe018..3a76816 100644 --- a/dist/v12/custom/proxy.js +++ b/dist/v12/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 44e5; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 0382; SRI-version; v12) */ -!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",I="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); +!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",I="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v12/custom/proxy.js.map b/dist/v12/custom/proxy.js.map index f774fa0..1d90510 100644 --- a/dist/v12/custom/proxy.js.map +++ b/dist/v12/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && pages === 0 && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && pages === 0 && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/light.js b/dist/v12/light.js index 5cb9e2f..a4c3862 100644 --- a/dist/v12/light.js +++ b/dist/v12/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 31aa; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; e149; SRI-version; v12) */ -!function(l,e,t,f){try{var m=undefined,n="https:",r=l.console,a="doNotTrack",g=l.navigator,d=l.location,h=d.host,i=l.document,o=g.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,p=decodeURIComponent,u=JSON.stringify,y=l.addEventListener,_="https://queue."+t,b=(i.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,E=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),$=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||x($,V)||"sa",C=e.strictUtm||"true"==x($,"strict-utm"),T=B+"_loaded";if(1==l[T])return f(c+"twice");l.sa_event_loaded=!0,l[T]=!0;var F,H=function(t,e,n){t=n?t:A(M,Z,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||x($,"hostname"),z=L||h,J={version:"cdn_light_12",hostname:z};e.mode||x($,"mode");try{F=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}E&&(J.bot=!0);var M=A(J,{ua:o,https:d.protocol==n,timezone:F,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!0,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==h&&(M.hostname_original=h),a in g&&"1"==g[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||L||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||x($,"referrer")||i.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,K=function(e,t){if(0,!N||0!==k||X()){var n=A(J,{type:"append",original_id:t?e:M.page_id});if(t||!g.sendBeacon)H(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",u(n))}catch(r){H(n,0,!0)}}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:m;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||m);H({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);q(t)&&-1>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||x($,V)||"sa",C=e.strictUtm||"true"==x($,"strict-utm"),T=B+"_loaded";if(1==l[T])return f(c+"twice");l.sa_event_loaded=!0,l[T]=!0;var F,H=function(t,e,n){t=n?t:A(M,Z,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||x($,"hostname"),z=L||h,J={version:"cdn_light_12",hostname:z};e.mode||x($,"mode");try{F=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}E&&(J.bot=!0);var M=A(J,{ua:o,https:d.protocol==n,timezone:F,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!0,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==h&&(M.hostname_original=h),a in g&&"1"==g[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||L||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||x($,"referrer")||i.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,K=function(e,t){if(0,!N||P||X()){var n=A(J,{type:"append",original_id:t?e:M.page_id});if(t||!g.sendBeacon)H(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",u(n))}catch(r){H(n,0,!0)}}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:m;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||m);H({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);q(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && pages === 0 && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && pages === 0 && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/src/default.js b/src/default.js index 716848e..52107f1 100644 --- a/src/default.js +++ b/src/default.js @@ -649,7 +649,7 @@ var sendOnLeave = function (id, push) { if (!collectDataOnLeave) return; - if (pageLoadId && pages === 0 && !getPath()) return; + if (pageLoadId && !lastSendPath && !getPath()) return; var append = assign(basePayload, { type: "append", @@ -844,7 +844,7 @@ // Obfuscate personal data in URL by dropping the search and hash var path = getPath(pathOverwrite); - if (!path && pages === 0 && pageLoadId) { + if (!path && !lastSendPath && pageLoadId) { // An ignored initial page must not receive event or leave enrichment. payload.page_id = collectDataOnLeave ? uuid() : undefinedVar; if (payload.session_id === pageLoadId) payload.session_id = uuid(); @@ -1096,7 +1096,7 @@ var firstPage = !userNavigated && pages < 2; // Manual collection may not have declared an allowed pageview yet. - if (pageLoadId && pages === 0 && !getPath()) { + if (pageLoadId && !lastSendPath && !getPath()) { eventParams.page_id = undefinedVar; eventParams.session_id = undefinedVar; } diff --git a/test/unit/page-load-id.test.js b/test/unit/page-load-id.test.js index 086814a..6aeb5e8 100644 --- a/test/unit/page-load-id.test.js +++ b/test/unit/page-load-id.test.js @@ -11,6 +11,55 @@ const requests = (dom) => const wait = () => new Promise((resolve) => setTimeout(resolve, 20)); describe("server page-load ID", function () { + it("keeps accepted manual attribution while client hints are pending", async function () { + const dom = createDOM({ + url: "https://example.com/ignore", + settings: { pageLoadId, autoCollect: false, ignorePages: "/ignore" }, + beforeRun(context) { + runInContext( + `Object.defineProperty(navigator, "userAgentData", { + value: { + brands: [], + mobile: false, + getHighEntropyValues: function() { + return new Promise(function(resolve) { + window.resolveClientHints = resolve; + }); + } + } + });`, + context + ); + }, + }); + dom.window.sa_pageview("/allowed"); + dom.window.sa_event("pending_hints"); + await wait(); + const early = requests(dom).find( + (params) => params.get("event") === "pending_hints" + ); + expect(early.get("page_id")).to.equal(pageLoadId); + expect(early.get("session_id")).to.equal(pageLoadId); + + // A later ignored call must not discard the accepted pageview's ID. + dom.window.sa_pageview("/ignore"); + dom.window.dispatchEvent(new dom.window.Event("pagehide")); + const leave = JSON.parse( + dom.sent.find(({ type }) => type === "beacon").data + ); + expect(leave.original_id).to.equal(pageLoadId); + + dom.window.resolveClientHints({ platform: "macOS", platformVersion: "15" }); + await wait(); + const initial = requests(dom).find( + (params) => params.get("type") === "append" + ); + expect(initial.get("path")).to.equal("/allowed"); + expect(initial.get("id")).to.equal(pageLoadId); + expect(initial.get("original_id")).to.equal(pageLoadId); + dom.window.close(); + }); + it("withholds ignored-URL attribution until a manual allowed pageview is declared", async function () { const dom = createDOM({ url: "https://example.com/ignore", From d1f9c5cea1cf79ee367c5d2649b1e3e03dece8bf Mon Sep 17 00:00:00 2001 From: Simple Analytics Codex Date: Mon, 5 Oct 2026 12:38:07 +0200 Subject: [PATCH 7/9] Patch serialization tooling and align Node guidance --- AGENTS.md | 2 +- pnpm-lock.yaml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 57a0759..c53e96b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -4,7 +4,7 @@ This repository contains the public scripts for Simple Analytics. When making ch ## Development -- Use **Node.js 22.16** (see `.nvmrc`). +- Use the Node.js version pinned in `.nvmrc` (currently **24.18.0**). - Run `npm run build` to compile the scripts. This generates the files in `dist/` which should be committed. - Format code with Prettier before committing. You can run `npx prettier -w .` or validate with `npm run prettier`. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7099145..d5cffbd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -881,8 +881,8 @@ packages: engines: {node: '>=10'} hasBin: true - serialize-javascript@7.1.1: - resolution: {integrity: sha512-k3CMsaIvvdSwm8oLB4MXSl0wH2/cwlH7xGcnRd2DaeRmBkbzYmyT8j0tsX60DwD1eRwHTpNpH8ljKu9oUT1MeQ==} + serialize-javascript@7.1.2: + resolution: {integrity: sha512-GL2BWwVa6JydKO6l/ljVgjAZF4QJ3S7dWDWi53s5GZT8PJzD2fNxi67HANQGKAqPrwEpL5ba7gUBGi0Ls/sEoQ==} engines: {node: '>=20.0.0'} setimmediate@1.0.5: @@ -1736,7 +1736,7 @@ snapshots: minimatch: 10.2.6 ms: 2.1.3 picocolors: 1.1.1 - serialize-javascript: 7.1.1 + serialize-javascript: 7.1.2 strip-json-comments: 5.0.3 supports-color: 8.1.1 workerpool: 10.0.3 @@ -1877,7 +1877,7 @@ snapshots: semver@7.8.5: {} - serialize-javascript@7.1.1: {} + serialize-javascript@7.1.2: {} setimmediate@1.0.5: {} From fb371fcacec32432000d70a4dbf4d556b2819b02 Mon Sep 17 00:00:00 2001 From: Simple Analytics Codex Date: Mon, 5 Oct 2026 13:28:11 +0200 Subject: [PATCH 8/9] Fix pageview attribution while client hints are pending --- dist/latest/cloudflare.js | 56 +++++++++++----------- dist/latest/custom/app.js | 4 +- dist/latest/custom/app.js.map | 2 +- dist/latest/custom/e.js | 4 +- dist/latest/custom/e.js.map | 2 +- dist/latest/custom/latest.dev.js | 56 +++++++++++----------- dist/latest/custom/latest.js | 4 +- dist/latest/custom/latest.js.map | 2 +- dist/latest/custom/light.js | 4 +- dist/latest/custom/light.js.map | 2 +- dist/latest/custom/proxy.js | 4 +- dist/latest/custom/proxy.js.map | 2 +- dist/latest/hello.js | 4 +- dist/latest/hello.js.map | 2 +- dist/latest/latest.dev.js | 56 +++++++++++----------- dist/latest/latest.js | 4 +- dist/latest/latest.js.map | 2 +- dist/latest/light.js | 4 +- dist/latest/light.js.map | 2 +- dist/v12/app.js | 4 +- dist/v12/app.js.map | 2 +- dist/v12/custom/app.js | 4 +- dist/v12/custom/app.js.map | 2 +- dist/v12/custom/light.js | 4 +- dist/v12/custom/light.js.map | 2 +- dist/v12/custom/proxy.js | 4 +- dist/v12/custom/proxy.js.map | 2 +- dist/v12/light.js | 4 +- dist/v12/light.js.map | 2 +- src/default.js | 62 ++++++++++++------------- test/unit/page-load-id.test.js | 80 +++++++++++++++++++++++++++++++- 31 files changed, 228 insertions(+), 160 deletions(-) diff --git a/dist/latest/cloudflare.js b/dist/latest/cloudflare.js index be57aef..fcebbb2 100644 --- a/dist/latest/cloudflare.js +++ b/dist/latest/cloudflare.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 57bf; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; a888; v12) */ /* eslint-env browser */ (function ( @@ -686,41 +686,39 @@ var previousReferrer; - // Send page view and append data to it - var sendPageView = function ( + // Capture each accepted pageview before waiting for client hints. + var preparePageView = function ( isPushState, deleteSourceInfo, sameSite, search, - metadata, - callback + metadata ) { if (isPushState) sendOnLeave("" + payload.page_id, trueVar); var originalId = pages === 0 ? pageLoadId : undefinedVar; payload.page_id = originalId || (collectDataOnLeave ? uuid() : undefinedVar); - var currentPage = definedHostname + getPath(); + var currentPage = definedHostname + page.path; var query = getQueryParams(deleteSourceInfo, search); - sendData( - { - id: payload.page_id, - original_id: originalId, - type: originalId ? "append" : pageviewText, - referrer: !deleteSourceInfo || sameSite ? referrer : null, - query: query, - k: k, - - metadata: stringify(metadata), - }, - callback - ); + var data = assign(page, { + id: payload.page_id, + page_id: payload.page_id, + original_id: originalId, + type: originalId ? "append" : pageviewText, + referrer: !deleteSourceInfo || sameSite ? referrer : null, + query: query, + k: k, + + metadata: stringify(metadata), + }); previousReferrer = referrer; referrer = currentPage; pages++; + return data; }; var sameSite, userNavigated; @@ -819,18 +817,18 @@ path: page.path, }); + var delSrc = isPushState || userNavigated || !collectMetricByString("r"); + var pageviewData = preparePageView( + isPushState, + delSrc, // r = referrers + sameSite, + querySearch, + metadata + ); + var triggerSendPageView = function () { fetchedHighEntropyValues = trueVar; - var delSrc = - isPushState || userNavigated || !collectMetricByString("r"); - sendPageView( - isPushState, - delSrc, // r = referrers - sameSite, - querySearch, - metadata, - callback - ); + sendData(pageviewData, callback); }; if (!fetchedHighEntropyValues) { diff --git a/dist/latest/custom/app.js b/dist/latest/custom/app.js index cbbb6da..e4f3f78 100644 --- a/dist/latest/custom/app.js +++ b/dist/latest/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 8935; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; eb51; v12) */ -!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); +!function(g,t,e,n,m){try{var v=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=g.console,c="doNotTrack",b=g.navigator,s=g.location,O=s.host,l=g.document,p=b.userAgent,f="Not sending request ",d=f+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=g.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=g.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=g[st+"_metadata"];Z(n)&&(t=K(t,n));var r=g[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(g,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==_&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/latest/custom/app.js.map b/dist/latest/custom/app.js.map index 2041ae6..920ab36 100644 --- a/dist/latest/custom/app.js.map +++ b/dist/latest/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/e.js b/dist/latest/custom/e.js index a9bbf97..be13a83 100644 --- a/dist/latest/custom/e.js +++ b/dist/latest/custom/e.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; f435; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; 5768; v12) */ -!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); +!function(g,t,e,n,m){try{var v=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=g.console,c="doNotTrack",b=g.navigator,s=g.location,O=s.host,l=g.document,p=b.userAgent,f="Not sending request ",d=f+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=g.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=g.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=g[st+"_metadata"];Z(n)&&(t=K(t,n));var r=g[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(g,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==_&&0"); //# sourceMappingURL=e.js.map \ No newline at end of file diff --git a/dist/latest/custom/e.js.map b/dist/latest/custom/e.js.map index b650578..5079bc9 100644 --- a/dist/latest/custom/e.js.map +++ b/dist/latest/custom/e.js.map @@ -1 +1 @@ -{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAhBW3B,WAgB4BR,EACvCoC,EAAkBf,EAAIe,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAASzB,EAAI0B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK5B,KAAe,WAAW4B,KAAK5B,GACxD6B,EAAStD,EAAOsD,OAIhBC,EACFhC,EAAIiC,eAAiBjC,EAAIkC,cAAc,gBAAkBvD,EAAU,MAOrEE,EAAO,WAEL,IAAIsD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK9C,EAAIV,KAAMU,EAAK4C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnChE,EAAK,iBAAmB+D,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWjG,EAAOkG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKnG,GAAkBqF,OAG5DrF,EAAmB0F,EAAO1F,EAAkBgG,GAExCE,GAAa/F,EAAK,WAAYH,GAGlC,IAAIoG,GACFpG,EAAiBoG,YAActB,EAAKxB,EAAe,gBAE7B,iBAAf8C,IACN,yEAAyEhD,KACxEgD,MAGFA,GAAahG,GAIf,IA+EIiG,GA/EAC,GAAgBrB,EAClBjF,EAAiBsG,eAAiBxB,EAAKxB,EAAe,mBAGpDiD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU7B,GAC7B,OAAO,IAAI8B,OAAO,IAAMF,GAAoBpD,KAAKwB,KAChDS,QAIHsB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe/G,EAAOgH,QAAUhH,EAAOiH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOnD,GACP,OAAO8C,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF7H,EAAiB4H,KACjB9C,EAAKxB,EAAesE,KAqzBxB,KAlzBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBlI,EAAO8H,GAAY,aACpCtC,EAAS0C,KAAiBF,EAAWrC,EAAOqC,EAAUE,IAC1D,IAAIC,EAA4BnI,EAAOoI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACFhI,EACEgI,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOrC,EACLqC,EACAG,EAA0BvE,KAAK5D,EAAQ2F,EAAOqC,EAAUC,KAE1D,MAAO7D,GACPF,EAAe,WAAYE,KAU3BiE,GACFpI,EAAiBoI,WACjBtD,EAAKxB,EAAe,eAAiB9C,EAInC6H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAKhG,EACvD,IAAIiI,GAAKD,GAAmBrH,EAAIuH,QAC7B/E,MAAM,GACN4B,MAAM,KACNmB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM9F,GAAgB,EAAJoI,GAASD,EAAShF,MAAMiF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAShF,MAAM,EAAGiF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIrE,GAAasE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAY1D,OAAe9E,EAInC,IAAImG,OAAOwC,EAAO,KAAK9F,KAAKsF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKjG,EACFoI,GAAKpI,GA+BV+I,GAAiBtB,GAAY,UACjC,GAAI9H,EAAOoJ,KAAmB7I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOqJ,gBAAkB9I,EACzBP,EAAOoJ,IAAkB7I,EAOzB,IAAI+I,GAAW,SAAUrB,EAAMsB,EAAUC,GACvCvB,EAAOuB,EAAevB,EAAOtC,EAAO8D,GAASC,GAAMzB,GAE/ChH,EAAI0I,QAAUH,IAAcvB,EAAK0B,MAAQpJ,GACzCU,EAAI2I,qBAAuBJ,IAAcvB,EAAK4B,KAAOtJ,GAGzD,IAAIuJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJ7H,EACA,eACAmC,OAAO4B,KAAK6B,GACTvB,OAAO,SAAUyD,GAChB,OAAOlC,EAAKkC,IAAQ9J,IAErB4I,IAAI,SAAUkB,GACb,OACEtI,EAAuBsI,GACvB,IACAtI,EAAuBoG,EAAKkC,MAG/BjB,KAAK,KACR,SACArC,KAAKD,OAILwD,GACFnK,EAAiBoK,UAAYtF,EAAKxB,EAAe,YAC/C+G,GAAkBF,IAAuB/I,EAEzCkJ,GAAc,CAChBC,QAmqBJ,mBAlqBIH,SAAUC,IASZnK,EAAY,SAAUsK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJrK,EAAKqK,GACLnB,GACE3D,EAAO4E,GAAa,CAClBI,KAAM9J,EACNuD,MAAOqG,EACPG,KAAMzJ,EAAI0J,WAEZxK,EACAE,IAMJ4B,EACEtB,EACA,SAAUiK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASlC,QAAQ3I,IAC3CC,EAAU2K,EAAME,UAGpBxK,GAOF,IAwDIyK,GAxDAC,GAAQtE,KAERuE,GAAW,EAOXC,GAAOnL,EAAiBmL,MAAQrG,EAAKxB,EAAe,QAGpD8H,MA/KsBC,GA+KCrL,EAAiBoL,cA9KvBC,GA+KjBrL,EAAiBoL,WACjBtG,EAAKxB,EAAe,eAAiB9C,GACrCsE,EAAKxB,EAAe,aAAe9C,GACnCsE,EAAKxB,EAAe,gBAAkB9C,EAGtC8K,KACqC,SAAvCxG,EAAKxB,EAAe,iBACpBtD,EAAiBsL,cAAgB/K,GAI/BgL,GACFvL,EAAiBwL,UACjB1G,EAAKxB,EAAe,cACpBuE,GAAY,IAAMlH,EAGhB8K,GAAcxG,EAChBjF,EAAiByL,aAAe3G,EAAKxB,EAAe,iBAIlDyF,GAAc9D,EAChBjF,EAAiB+I,aAAejE,EAAKxB,EAAe,iBAIlDoI,GAAqBzG,EACvBjF,EAAiB0L,oBACf5G,EAAKxB,EAAe,yBAIpBqI,GACF3L,EAAiB2L,gBAAkB7G,EAAKxB,EAAe,mBAGrD6E,GACFnI,EAAiBmI,mBACjBrD,EAAKxB,EAAe,sBAItB,IAEE0H,GAAWzE,GAAsB,KAC7BqF,KAAKC,iBAAiBC,kBAAkBC,SACxC3L,EACJ,MAAO+D,IACPhE,EAAKgE,IAOP,IAAI6H,GAAUjM,EAAOiM,QACjBC,GACFjL,EAAIkL,WACJnM,EAAOoM,aACPpM,EAAOqM,aACPrM,EAAOsM,UACNL,KAAYA,GAAQM,QACrBvM,EAAOwM,YACPxM,EAAOyM,MACPrJ,GACAqE,KAAKC,UAAYD,KAAKC,SAGpBgF,GACFlG,GAAsB,MAAQA,GAAsB,QAElD0F,KAAK3B,GAAY2B,IAAM3L,GAE3B,IAAIkJ,GAAU9D,EAAO4E,GAAa,CAEhCoC,GAAInG,GAAsB,MAAQ/E,EAAYpB,EAE9CK,MAAOS,EAAIyL,UAAYlM,EACvBuK,SAAUA,GACV4B,sBAAuBtM,EACvBuM,QAASzG,KAAeqG,GAAqB5F,KAASzG,GAGtD0M,WAAYvG,GAAsB,MAC9BH,IAAcS,KACdzG,IA0BN,GAvBAoJ,GAAQuD,IAAMxM,EAIVkC,IACF+G,GAAQwD,OAASvK,EAAOuK,OACxBxD,GAAQyD,OAASjL,EAAUS,EAAOwK,SAS/B3L,EAAI4L,SAAS/M,EAAK,4CAInBkK,KAAoBjJ,IACtBoI,GAAQ2D,kBAAoB/L,IAGzBgK,IAAcrK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBkC,EAAU,SAK7B,GAAlC7B,EAAiBwH,QAAQ,OACxB,aAAaxF,KAAKhC,IACnB+I,IAEDhK,EACE,mBACEiB,EACA,SACA6B,EACA,0BAON,IACImK,GA2DAC,GA5DA5D,GAAO,GAGP6D,GAAc,WAKhB,OAFEtN,EAAiBuN,UAAYzI,EAAKxB,EAAe,aAGzBhC,EAAIiM,UAAY,IACrC1I,QAAQzD,EAAkBiJ,IAC1BxF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAASzE,GAKjCmN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKlB,MACDrG,IAAegH,IAAiBQ,MAApC,CAEA,IAAIC,EAASnI,EAAO4E,GAAa,CAC/BI,KAAM,SACNoD,YAAaH,EAAOD,EAAKlE,GAAQqD,UAenC,GAXItG,GAAsB,OACxBsH,EAAOE,SAAWvG,KAAKwG,OAAOrH,KAAQsE,GAAQuC,IAnhBnC,MAqhBbA,GAAW,EACXvC,GAAQtE,KAGJJ,GAAsB,UACxBsH,EAAO3C,SAAW1D,KAAKyG,IAAI,EAAG/C,GAAUgD,OAGtCP,IAAS3M,EAAImN,WAEf9E,GAASwE,EAAQzN,EAAcE,QAE/B,IACEU,EAAImN,WAAWC,KAAKpN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU6L,IAC3D,MAAOQ,GAEPhF,GAASwE,EAAQzN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAIgN,QACA,KAAOxL,KAAY/C,GAAS0N,KAClCJ,GAAc1G,MACT6G,IAAY7G,KAAQ0G,IAE7B9M,GAGF2B,EAAqBY,EAAU2K,GAAalN,GAE5C,IAAIgO,GAAOjN,EAAIiN,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuBnM,EAAgBQ,IAAiB,EACxD4L,EAASjH,KAAKyG,IAChBM,GAAK5L,IAAiB,EACtB4L,GAAK3L,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO4E,KAAKkH,IACV,IAKI,EAJJlH,KAAKwG,MACF,MAAQ3L,EAAgBsM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOtK,IAEP,OADAhE,EAAKgE,IACE,IAIXjC,EAAqB,OAAQ,WAC3BgJ,GAAWgD,KACXhM,EACEM,EACA,WACM0I,GAAWgD,OAAYhD,GAAWgD,OAExC3N,KAQJ,IAgCIqO,GAuCAC,GAAUC,GAvEVlB,GAAU,SAAUmB,GACtB,IAAIpE,EAAO,GAIX,IACEA,EAAOoE,GAAajN,EAAuBZ,EAAI0J,UAC/C,MAAOzG,IACPhE,EAAKgE,IAGP,IAAI6K,EAAyBjP,EAAO4L,IACpC,GAAIjE,GAAWsH,GACb,IACErE,EAAOqE,EAAuBrL,KAAK5D,EAAQ,CAAE4K,KAAMA,KAAWA,EAC9D,MAAOxG,IACPF,EAAe,OAAQE,IAK3B,IAhZiB,SAAUwG,GAC3B,IAAK,IAAIhC,KAAK8C,GAAa,CACzB,IAAIwD,EAAgBxD,GAAY9C,GAChC,GAAKsG,EAAL,CAGA,IAAIC,EA1PI,KA2PND,EAAc,GAAcA,EA3PtB,IA2P8CA,EAEtD,GACEC,IAAevE,GACf,IAAIjE,OACF,IAAM/B,EAAYuK,GAAYrK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKuH,GAEP,OAAOrK,GAEX,OAAOC,EA8XH4O,CAAaxE,GAQjB,MAFY,QAARQ,IAAkBjK,EAAIkO,OAAMzE,GAAQzJ,EAAIkO,KAAK9J,MAAM,KAAK,IAErDqF,EAPLxK,EAAKuB,EAAiB,YAAciJ,IAmDpC0E,GAAW,SACbC,EACAC,EACAxH,EACAyH,IAEKA,GAAe9H,GAAWK,KAAWyH,EAAczH,GACxD,IACI0H,EAGEC,EAJFpG,EAAW5B,GAAW8H,GAAeA,EAAc,aAEnD/K,EAAS8K,KAAgD,EAA9BA,EAAc3G,QAAQ,OAGnD2G,GADIG,EAAQH,EAAcjK,MAAM,MACVqK,QACtBF,EAAc,IAAMC,EAAMzG,KAAK,MAGjC,IAAI0B,EAAOiD,GAAQ2B,GAUnB,GARK5E,GAASyC,KAAgBhH,KAE5BoD,GAAQqD,QAAUJ,GAAqB5F,KAASzG,EAC5CoJ,GAAQsD,aAAe1G,KAAYoD,GAAQsD,WAAajG,MAC5DT,GAAahG,GAIVuK,GAAQyC,IAAgBzC,EAA7B,CAEAyC,GAAezC,EACflB,GAAKkB,KAAOA,EAGRpE,GAAsB,OACxBkD,GAAKmG,eACHpI,KAAKyG,IAAI5L,EAA2B,aAAK,EAAGtC,EAAO8P,YAAc,IACjE,KACFpG,GAAKqG,gBACHtI,KAAKyG,IACH5L,EAAgBQ,IAAiB,EACjC9C,EAAOgQ,aAAe,IACnB,MAILxJ,GAAsB,MACpBvF,EAAIsB,KAAWmH,GAAKnH,GAAYtB,EAAIsB,IAItCe,GAAUkD,GAAsB,QAClCkD,GAAKuG,aAAe3M,EAAO4M,MAC3BxG,GAAKyG,cAAgB7M,EAAOoL,QAI9B,IAII0B,EAJAC,EAAOrQ,EAAOsQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG5F,KAC/D,MAAOvG,IACPhE,EAAKgE,IAGP2K,GAAgBqB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBvH,QAAQuH,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAG1H,QAAQwH,EAAKE,GAAgB5F,MAGxC,IAAI8F,EAA0BjD,GAC1BA,GAASjI,MApwBH,KAowBgB,GACtBlF,EACJyO,GAAWtB,IACgD,EAAvD7B,GAAmB9C,QAAQ4H,IAC3BA,GAA2BpP,EAC3Bb,EAGJkJ,GAAKgH,OACH,QAAQrN,KAAKkK,OAAkBgC,GAAeR,GAC1CvO,GACCsO,GAEP9G,EAAWD,GAAeC,EAAU,CAClC2C,KAAMhK,EACNiK,KAAMlB,GAAKkB,OAGb,IAAI+F,EAAsB,WACxB/O,EAA2BrB,EAC3B,IAAIqQ,EACFrB,GAAeR,KAAkBvI,GAAsB,MAvI1C,SACjB+I,EACAsB,EACA/B,EACApG,EACAV,EACAuB,GAEIgG,GAAa7B,GAAY,GAAKjE,GAAQqD,QAASvM,GACnD,IAAIuQ,EAAuB,IAAV3N,EAAckD,GAAahG,EAC5CoJ,GAAQqD,QACNgE,IAAepE,GAAqB5F,KAASzG,GAE/C,IAAI0Q,EAAczG,GAAkBuD,KAChCmD,EAAQ1I,GAAeuI,EAAkBnI,GAE7CY,GACE,CACEqE,GAAIlE,GAAQqD,QACZiB,YAAa+C,EACbnG,KAAMmG,EAAa,SAAWnQ,EAC9B6M,UAAWqD,GAAoB/B,EAAWtB,GAAW,KACrDwD,MAAOA,EACP1K,EAAGA,GAEH0B,SAAU/F,EAAU+F,IAEtBuB,GAGFsF,GAAmBrB,GACnBA,GAAWuD,EAEX5N,IAuGE8N,CACE1B,EACAqB,EACA9B,GACAY,EACA1H,EACAuB,IAIJ,GAAK3H,EAmBH+O,SAjBA,IACMjO,GAAUiF,GAAWjF,EAAOwO,sBAC9BxO,EACGwO,qBAAqB,CAAClO,EAAcC,IACpCkO,KAAK,SAAUC,GACd3H,GAAQ4H,QAAUD,EAAkBpO,GACpCyG,GAAQ6H,WAAaF,EAAkBnO,GACvC0N,MAEDY,SAAMZ,GAETA,IAEF,MAAOrC,GACPqC,OAWFa,GAAMxR,EAAOyR,QACbC,GAAeF,GAAMA,GAAIG,UAAYtR,EACrCuR,GAAM5R,EAAO6R,cACbC,GAAgB,YAIhBvG,IAAemG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB7G,GAoBAmH,IAlBrB,WACL,IAEIhH,EAFAjF,EAAMhC,UACNoO,EAAKD,GAAK/N,MAAMiO,KAAMrM,GAY1B,OAVI8B,GAAWoK,OACbjH,EAAQ,IAAIiH,MAAMpH,KAIlBG,EAAQvJ,EAAI4Q,YAAY,UAClBC,UAAUzH,GAAMpK,EAASA,GAEjCuK,EAAMjH,UAAYgC,EAClB+L,GAAI9G,GACGmH,IAMX9P,EACE2P,GACA,WACExC,GAAS,IAEX9O,GAGF2B,EACE,WACA,WACEmN,GAAS,IAEX9O,IAKA+K,IAAuB,QAARH,IAAkB,iBAAkBpL,GACrDmC,EACE,aACA,WACEmN,GAAS,IAEX9O,GAIA+K,IAAa+D,KAEjBtP,EAAOqS,YAAc,SAAUzH,EAAM5C,EAAUuB,GAC7C+F,GAAS,EAAG1E,EAAM5C,EAAUuB,IAQ9B,IAAI+I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUzH,EAAO9C,EAAUyH,IACpCA,GAAe9H,GAAWK,KAAWyH,EAAczH,GAExD,IAAIwK,EAAkB7K,GAAWmD,GAC7BvB,EAAW5B,GAAW8H,GAAeA,EAAc,aACnDgD,SAAmB3H,EAEvB,GAAIwH,GAAWzJ,QAAQ4J,GAAa,IAAMD,EAExC,OADAtO,EAAesH,GAAmB5K,EAAY,aAAe6R,GACtDlJ,IAGT,IACE,GAAIiJ,EAAiB,CACnB,IAAIE,EAAc5H,IAClB,GAAIwH,GAAWzJ,eAAe6J,GAAe,EAK3C,OAJAxO,EACEsH,GACAV,EAAQ,uBAAyB4H,GAE5BnJ,IAETuB,EAAQ4H,GAEV,MAAOtO,IAEP,OADAF,EAAesH,GAAmBpH,IAC3BmF,IAGTuB,GAAS,GAAKA,GAAOhG,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAI6N,EAAc,CAAEhI,KAAM/J,EAAWkK,MAAOA,GACxC8H,GAAa7D,IAAiB5L,EAAQ,GAGtCkD,IAAegH,IAAiBQ,OAClC8E,EAAY7F,QAAUzM,EACtBsS,EAAY5F,WAAa1M,GAG3B2H,EAAWD,GAAeC,EAAU2K,GAEhC7H,GACFxB,GACE3D,EAAOgN,EAAa,CAClBhF,GAAI7G,KACJkK,MAAO1I,IAAgBsK,GACvBpF,UACGoF,GAAa9D,KAAatI,GAAsB,KAC7CqI,GACA,KAEN7G,SAAU/F,EAAU+F,KAEtBuB,IAKFsJ,GAAmB,SAAU/H,EAAO9C,EAAUuB,GAChDgJ,GAAUzH,EAAO9C,EAAUuB,IAIxBvJ,EAAOwL,MACVxL,EAAOwL,IAAqBqH,IAE9B,IAAIC,GAAY9S,EAAOwL,IAGnBuH,GAAQD,IAAaA,GAAUrK,EAAIqK,GAAUrK,EAAI,GAMrD,IAAK,IAAIqC,MAHT9K,EAAOwL,IAAqBqH,GAGVE,GACZ1O,EAAQ0O,GAAOjI,MACjB1F,MAAMC,QAAQ0N,GAAMjI,KAChByH,GAAUtO,MAAM,KAAM8O,GAAMjI,KAC5ByH,GAAUQ,GAAMjI,MAGxB,MAAOwD,IACPnO,EAAUmO,IAnJY,IAAU3D,GACxBqH,GAnoBkB1G,GA/N9B,CAu/BEtL,OACA,uBACA"} \ No newline at end of file +{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/latest.dev.js b/dist/latest/custom/latest.dev.js index d20ae14..b4116d9 100644 --- a/dist/latest/custom/latest.dev.js +++ b/dist/latest/custom/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 23b9; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; f156; v12) */ /* eslint-env browser */ (function ( @@ -686,41 +686,39 @@ var previousReferrer; - // Send page view and append data to it - var sendPageView = function ( + // Capture each accepted pageview before waiting for client hints. + var preparePageView = function ( isPushState, deleteSourceInfo, sameSite, search, - metadata, - callback + metadata ) { if (isPushState) sendOnLeave("" + payload.page_id, trueVar); var originalId = pages === 0 ? pageLoadId : undefinedVar; payload.page_id = originalId || (collectDataOnLeave ? uuid() : undefinedVar); - var currentPage = definedHostname + getPath(); + var currentPage = definedHostname + page.path; var query = getQueryParams(deleteSourceInfo, search); - sendData( - { - id: payload.page_id, - original_id: originalId, - type: originalId ? "append" : pageviewText, - referrer: !deleteSourceInfo || sameSite ? referrer : null, - query: query, - k: k, - - metadata: stringify(metadata), - }, - callback - ); + var data = assign(page, { + id: payload.page_id, + page_id: payload.page_id, + original_id: originalId, + type: originalId ? "append" : pageviewText, + referrer: !deleteSourceInfo || sameSite ? referrer : null, + query: query, + k: k, + + metadata: stringify(metadata), + }); previousReferrer = referrer; referrer = currentPage; pages++; + return data; }; var sameSite, userNavigated; @@ -819,18 +817,18 @@ path: page.path, }); + var delSrc = isPushState || userNavigated || !collectMetricByString("r"); + var pageviewData = preparePageView( + isPushState, + delSrc, // r = referrers + sameSite, + querySearch, + metadata + ); + var triggerSendPageView = function () { fetchedHighEntropyValues = trueVar; - var delSrc = - isPushState || userNavigated || !collectMetricByString("r"); - sendPageView( - isPushState, - delSrc, // r = referrers - sameSite, - querySearch, - metadata, - callback - ); + sendData(pageviewData, callback); }; if (!fetchedHighEntropyValues) { diff --git a/dist/latest/custom/latest.js b/dist/latest/custom/latest.js index f1a553e..b60e161 100644 --- a/dist/latest/custom/latest.js +++ b/dist/latest/custom/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 5b66; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; df5d; v12) */ -!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); +!function(g,t,e,n,m){try{var v=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=g.console,c="doNotTrack",b=g.navigator,s=g.location,O=s.host,l=g.document,p=b.userAgent,f="Not sending request ",d=f+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=g.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=g.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=g[st+"_metadata"];Z(n)&&(t=K(t,n));var r=g[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(g,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==_&&0"); //# sourceMappingURL=latest.js.map \ No newline at end of file diff --git a/dist/latest/custom/latest.js.map b/dist/latest/custom/latest.js.map index 798c515..df56782 100644 --- a/dist/latest/custom/latest.js.map +++ b/dist/latest/custom/latest.js.map @@ -1 +1 @@ -{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/light.js b/dist/latest/custom/light.js index 64b0e97..9173893 100644 --- a/dist/latest/custom/light.js +++ b/dist/latest/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 027a; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; 1247; v12) */ -!function(l,e,t,f){try{var g=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,d=l.location,h=d.host,i=l.document,o=m.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,p=decodeURIComponent,u=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,x=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var $=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},I=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||A(E,V)||"sa",C=e.strictUtm||"true"==A(E,"strict-utm"),H=B+"_loaded";if(1==l[H])return f(c+"twice");l.sa_event_loaded=!0,l[H]=!0;var T,F=function(t,e,n){t=n?t:I(M,Z,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=g}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||A(E,"hostname"),z=L||h,J={version:"custom_light_12",hostname:z};e.mode||A(E,"mode");try{T=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}x&&(J.bot=!0);var M=I(J,{ua:o,https:d.protocol==n,timezone:T,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!1,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==h&&(M.hostname_original=h),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||L||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||A(E,"referrer")||i.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||g,K=function(e,t){if(0,!N||P||X()){var n=I(J,{type:"append",original_id:t?e:M.page_id});if(t||!m.sendBeacon)F(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",u(n))}catch(r){F(n,0,!0)}}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:g;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||g);F({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);$(t)&&-1"); +!function(f,e,t,g){try{var m=undefined,n="https:",r=f.console,a="doNotTrack",h=f.navigator,d=f.location,v=d.host,i=f.document,o=h.userAgent,c="Not sending request ",y=!1,s=encodeURIComponent,p=decodeURIComponent,u=JSON.stringify,l=f.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=h.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,x=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');g=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var $=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},I=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||A(E,V)||"sa",C=e.strictUtm||"true"==A(E,"strict-utm"),H=B+"_loaded";if(1==f[H])return g(c+"twice");f.sa_event_loaded=!0,f[H]=!0;var T,F=function(t,e,n){t=n?t:I(M,Z,t),h.brave&&!n&&(t.brave=!0),h._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||A(E,"hostname"),z=L||v,J={version:"custom_light_12",hostname:z};e.mode||A(E,"mode");try{T=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){g(ee)}x&&(J.bot=!0);var M=I(J,{ua:o,https:d.protocol==n,timezone:T,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!1,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==v&&(M.hostname_original=v),a in h&&"1"==h[a])return g("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=v.indexOf(".")&&!/^[0-9.:]+$/.test(v)||L||g("Set hostname on "+v+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||A(E,"referrer")||i.referrer||"").replace(v,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,K=function(e,t){if(0,!N||P||X()){var n=I(J,{type:"append",original_id:t?e:M.page_id});if(t||!h.sendBeacon)F(n,0,!0);else try{h.sendBeacon.bind(h)(_+"/append",u(n))}catch(r){F(n,0,!0)}}};l("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){g(ee)}return t},Y=function(e,t,n,r,a){e&&K(""+M.page_id,!0);var i=0===k?N:m;M.page_id=i||R();var o,c=z+Z.path,s=(o=t,(r||d.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||m),p=I(Z,{id:M.page_id,page_id:M.page_id,original_id:i,type:i?"append":"pageview",referrer:!t||n?G:null,query:s});return G=c,k++,p};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);$(t)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/latest/custom/light.js.map b/dist/latest/custom/light.js.map index 9f56f33..edb8c3f 100644 --- a/dist/latest/custom/light.js.map +++ b/dist/latest/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","preparePageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","pageviewData","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAKAC,GAEA,IAQE,IAAIC,EAAeC,UAIfC,EAAQ,SAKRC,EAAMP,EAAOQ,QACbC,EAAa,aACbC,EAAMV,EAAOW,UACbC,EAAMZ,EAAOa,SACbC,EAAmBF,EAAIG,KACvBC,EAAMhB,EAAOiB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBAEbC,GAhBW,EAiBXC,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuB3B,EAAO4B,iBAC9BC,EAhBWvB,WAgB4BJ,EAEvC4B,GADkBd,EAAIe,gBACX,YAIXC,EAAStB,EAAIuB,cAMbC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAKrB,KAAe,WAAWqB,KAAKrB,GAIxDsB,EACFxB,EAAIyB,eAAiBzB,EAAI0B,cAAc,gBAAkBxC,EAAU,MAOrEC,EAAO,WAEL,IAAIwC,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAKtC,EAAIJ,KAAMI,EAAKoC,IAGtD,IAQIQ,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAOZC,EAAO,SAAUb,EAAec,GAClC,OAAOd,GAAiBA,EAAce,aAAa,QAAUD,IAe3DE,EAAS,WAGX,IAFA,IA7BsBC,EAAKC,EAwBJC,EAKnBC,EAAK,GACLC,EAAMf,UACDgB,EAAQ,EAAGA,EAAQD,EAAIE,OAAQD,IAAS,CAC/C,IAAIE,EAAaH,EAAIC,GACrB,IATqBH,EASRK,IAREL,EAAOM,cAAgBC,OASpC,IAAK,IAAIC,KAAWH,EAlCFP,EAmCJO,EAnCSN,EAmCGS,EAlCvBD,OAAOjB,UAAUmB,eAAevB,KAAKY,EAAKC,KAmCzCE,EAAGO,GAAWH,EAAWG,IAKjC,OAAOP,GAGLS,EAAWrE,EAAOsE,YAClBC,EAAcF,GAAYH,OAAOM,KAAKvE,GAAkB8D,OAG5D9D,EAAmBuD,EAAOvD,EAAkBoE,GAExCE,GAAapE,EAAK,WAAYF,GAGlC,IAAIwE,EACFxE,EAAiBwE,YAAcpB,EAAKb,EAAe,gBAE7B,iBAAfiC,GACN,yEAAyElC,KACxEkC,KAGFA,EAAarE,GASLsE,KAAKC,IALf,IAOIC,EAAO,WACT,IAAIC,EAAe7E,EAAO8E,QAAU9E,EAAO+E,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,OACEA,EACCN,EAAaO,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOC,GACP,OAAOP,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,IAAIK,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMP,EAAI,EAAIK,EAAS,EAAJA,EAAW,GACrBF,SAAS,QAKpBK,EAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,EAAgB,YAChBC,EACF7F,EAAiB4F,IACjBxC,EAAKb,EAAeqD,IA2axB,KAjaME,EACF9F,EAAiB8F,WAnLJ,QAoLb1C,EAAKb,EAAe,cAoClBwD,EAAiBF,EAAY,UACjC,GA3Nc,GA2NV9F,EAAOgG,GAA4B,OAAO7F,EAAKgB,EAAa,SAChEnB,EAAOiG,iBA5NO,EA6NdjG,EAAOgG,IA7NO,EAoOd,IA4DIE,EA5DAC,EAAW,SAAUC,EAAMC,EAAUC,GACvCF,EAAOE,EAAeF,EAAO5C,EAAO+C,EAASC,EAAMJ,GAE/C1F,EAAI+F,QAAUH,IAAcF,EAAKK,OAvOzB,GAwOR/F,EAAIgG,qBAAuBJ,IAAcF,EAAKO,MAxOtC,IA2OA,IAAIC,OACVC,IACJhF,EACA,eACAqC,OAAOM,KAAK4B,GACTU,OAAO,SAAUC,GAChB,OAAOX,EAAKW,IAAQ3G,IAErB4G,IAAI,SAAUD,GACb,OACE1F,EAAuB0F,GACvB,IACA1F,EAAuB+E,EAAKW,MAG/BE,KAAK,KACR,SACAvC,KAAKC,OAILuC,EACFjH,EAAiBkH,UAAY9D,EAAKb,EAAe,YAC/C4E,EAAkBF,GAAuBpG,EAEzCuG,EAAc,CAChBC,QA+UJ,kBA9UIH,SAAUC,GAeDnH,EAAiBsH,MAAQlE,EAAKb,EAAe,QAYxD,IAEE0D,EACIsB,KAAKC,iBAAiBC,kBAAkBC,SAE5C,MAAOpC,IACPpF,EAAKoF,IAQGjD,IAMD+E,EAAYO,KArTP,GAuTd,IAAIrB,EAAU/C,EAAO6D,EAAa,CAEhCQ,GAAkC3G,EAElCZ,MAAOM,EAAIkH,UAAYxH,EACvB4F,SAAUA,EACV6B,uBA7TY,EA8TZC,QAASvD,GAAoCG,IAG7CqD,WACIxD,GAAcG,MAyBpB,GArBA2B,EAAQ2B,KArUO,EAyUXlG,IACFuE,EAAQ4B,OAASnG,EAAOmG,OACxB5B,EAAQ6B,OAAS3G,EAAUO,EAAOoG,SAWhChB,IAAoBtG,IACtByF,EAAQ8B,kBAAoBvH,GAG1BL,KAAcC,GAA0B,KAAnBA,EAAID,GAC3B,OAAON,EA5UYgB,4BA6UAV,EAAa,oBAAsB2B,EAAU,SAK7B,GAAlCtB,EAAiBwH,QAAQ,OACxB,aAAa/F,KAAKzB,IACnBoG,GAED/G,EACE,mBACEW,EACA,SACAsB,EACA,0BAON,IACImG,EADA/B,EAAO,GAiBPgC,GAXAvI,EAAiBuI,UAAYnF,EAAKb,EAAe,aAGzBxB,EAAIwH,UAAY,IACrCtD,QAAQpE,EAAkBsG,GAC1BlC,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS9E,EAcjCqI,EAAc,SAAUC,EAAIC,GAE9B,GADI,GACAlE,GAAe8D,GAAiBK,IAApC,CAEA,IAAIC,EAASrF,EAAO6D,EAAa,CAC/ByB,KAAM,SACNC,YAAaJ,EAAOD,EAAKnC,EAAQyB,UAKnC,GAAIW,IAASjI,EAAIsI,WAEf7C,EAAS0C,EAAQzI,GAzZP,QA2ZV,IACEM,EAAIsI,WAAWC,KAAKvI,EAApBA,CAAyBmB,EAAa,UAAWJ,EAAUoH,IAC3D,MAAOK,GAEP/C,EAAS0C,EAAQzI,GA/ZT,MAqaduB,EAnYe,WAmYgB8G,GApahB,GA2af,IAoDIU,EAAUC,EApDVR,EAAU,SAAUS,GACtB,IAAIC,EAAO,GAIX,IACEA,EAAOD,GAAa9H,EAAuBX,EAAI2I,UAC/C,MAAOhE,IACPpF,EAAKoF,IAMP,OAAO+D,GAMLE,EAAkB,SACpBC,EACAC,EACAP,EACAQ,EACAC,GAEIH,GAAahB,EAAY,GAAKlC,EAAQyB,SAvc9B,GAwcZ,IAAI6B,EAAuB,IAAVxH,EAAcoC,EAAarE,EAC5CmG,EAAQyB,QACN6B,GAAoCjF,IAEtC,IAnR6BkF,EAmRzBC,EAAc3C,EAAkBZ,EAAK8C,KACrCU,GApRyBF,EAoRFJ,GAAkBC,GAnRjB/I,EAAI+I,QAC7B/G,MAAM,GACNqH,MAAM,KACNnD,OAAO,SAAUoD,GAIhB,OAFaJ,GAaN,IAAIK,OART,YACCpE,EAAY,GAAK,KAClB,yCACCA,EAAY,GAAK,QAClB,KAIuB,KAAKxD,KAAK2H,KAEpCjD,KAAK,MAEI7G,GA+PRgG,EAAO5C,EAAOgD,EAAM,CACtBkC,GAAInC,EAAQyB,QACZA,QAASzB,EAAQyB,QACjBe,YAAac,EACbf,KAAMe,EAAa,SA/cJ,WAgdfrB,UAAWkB,GAAoBP,EAAWX,EAAW,KACrDwB,MAAOA,IAQT,OAHAxB,EAAWuB,EAEX1H,IACO+D,IAKM,SACbqD,EACAW,EACAR,EACAS,IAEKA,GAAe1E,EAAWiE,KAAWS,EAAcT,GACxD,IACIU,EAGEC,EAJS5E,EAAW0E,GAEtBlH,EAASiH,KAAgD,EAA9BA,EAAc9B,QAAQ,OAGnD8B,GADIG,EAAQH,EAAcH,MAAM,MACVO,QACtBF,EAAc,IAAMC,EAAMtD,KAAK,MAGjC,IAAIqC,EAAOV,EAAQwB,GAUnB,GARKd,GAASf,IAAgB9D,IAE5B8B,EAAQyB,QAA+BpD,IACnC2B,EAAQ0B,aAAexD,IAAY8B,EAAQ0B,WAAarD,KAC5DH,EAAarE,GAIVkJ,GAAQf,GAAgBe,EAA7B,CAEAf,EAAee,EACf9C,EAAK8C,KAAOA,EAKN5I,EAAIoB,KAAW0E,EAAK1E,GAAYpB,EAAIoB,IAK1C,IAII2I,EAJAC,EAAO1K,EAAO2K,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG9B,KAC/D,MAAOvD,IACPpF,EAAKoF,IAGP6D,EAAgBqB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBnC,QAAQmC,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGtC,QAAQoC,EAAKE,GAAgB9B,MAGxCK,IAAWX,GACPA,EAASyB,MAxhBH,KAwhBgB,IAAMnJ,EAKhC,IACIgK,EAAetB,EACjBC,EAFWA,GAAeL,IAAiB,EAI3CD,EACAmB,GAIES,EAAsB,WACxB3J,GA7iBU,EA8iBV+E,EAAS2E,IAGX,GAAK1J,EAmBH2J,SAjBA,IACM/I,GAAU2D,EAAW3D,EAAOgJ,sBAC9BhJ,EACGgJ,qBAAqB,CAAC9I,EAAcC,IACpC8I,KAAK,SAAUC,GACd3E,EAAQ4E,QAAUD,EAAkBhJ,GACpCqE,EAAQ6E,WAAaF,EAAkB/I,GACvC4I,MAEDM,SAAMN,GAETA,IAEF,MAAO7B,GACP6B,MASNO,GAEA,MAAOpC,IACP/I,EAAK+I,KAhmBT,CAmmBElJ,OACA,uBACA"} \ No newline at end of file diff --git a/dist/latest/custom/proxy.js b/dist/latest/custom/proxy.js index c606cdc..9e71007 100644 --- a/dist/latest/custom/proxy.js +++ b/dist/latest/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; abbe; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; 94c9; v12) */ -!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",I="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); +!function(g,t,e,n,m){try{var v=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=g.console,c="doNotTrack",b=g.navigator,s=g.location,x=s.host,l=g.document,p=b.userAgent,f="Not sending request ",d=f+"when ",O=_,h=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=g.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",I="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=g.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=g[st+"_metadata"];Z(n)&&(t=K(t,n));var r=g[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(g,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==_&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/latest/custom/proxy.js.map b/dist/latest/custom/proxy.js.map index 027334e..9832dd9 100644 --- a/dist/latest/custom/proxy.js.map +++ b/dist/latest/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAhBW3B,WAgB4BR,EACvCoC,EAAkBf,EAAIe,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAASzB,EAAI0B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK5B,KAAe,WAAW4B,KAAK5B,GACxD6B,EAAStD,EAAOsD,OAIhBC,EACFhC,EAAIiC,eAAiBjC,EAAIkC,cAAc,gBAAkBvD,EAAU,MAOrEE,EAAO,WAEL,IAAIsD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK9C,EAAIV,KAAMU,EAAK4C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnChE,EAAK,iBAAmB+D,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWjG,EAAOkG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKnG,GAAkBqF,OAG5DrF,EAAmB0F,EAAO1F,EAAkBgG,GAExCE,GAAa/F,EAAK,WAAYH,GAGlC,IAAIoG,GACFpG,EAAiBoG,YAActB,EAAKxB,EAAe,gBAE7B,iBAAf8C,IACN,yEAAyEhD,KACxEgD,MAGFA,GAAahG,GAIf,IA+EIiG,GA/EAC,GAAgBrB,EAClBjF,EAAiBsG,eAAiBxB,EAAKxB,EAAe,mBAGpDiD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU7B,GAC7B,OAAO,IAAI8B,OAAO,IAAMF,GAAoBpD,KAAKwB,KAChDS,QAIHsB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe/G,EAAOgH,QAAUhH,EAAOiH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOnD,GACP,OAAO8C,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF7H,EAAiB4H,KACjB9C,EAAKxB,EAAesE,KAqzBxB,KAlzBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBlI,EAAO8H,GAAY,aACpCtC,EAAS0C,KAAiBF,EAAWrC,EAAOqC,EAAUE,IAC1D,IAAIC,EAA4BnI,EAAOoI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACFhI,EACEgI,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOrC,EACLqC,EACAG,EAA0BvE,KAAK5D,EAAQ2F,EAAOqC,EAAUC,KAE1D,MAAO7D,GACPF,EAAe,WAAYE,KAU3BiE,GACFpI,EAAiBoI,WACjBtD,EAAKxB,EAAe,eAAiB9C,EAInC6H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAKhG,EACvD,IAAIiI,GAAKD,GAAmBrH,EAAIuH,QAC7B/E,MAAM,GACN4B,MAAM,KACNmB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM9F,GAAgB,EAAJoI,GAASD,EAAShF,MAAMiF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAShF,MAAM,EAAGiF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIrE,GAAasE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAY1D,OAAe9E,EAInC,IAAImG,OAAOwC,EAAO,KAAK9F,KAAKsF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKjG,EACFoI,GAAKpI,GA+BV+I,GAAiBtB,GAAY,UACjC,GAAI9H,EAAOoJ,KAAmB7I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOqJ,gBAAkB9I,EACzBP,EAAOoJ,IAAkB7I,EAOzB,IAAI+I,GAAW,SAAUrB,EAAMsB,EAAUC,GACvCvB,EAAOuB,EAAevB,EAAOtC,EAAO8D,GAASC,GAAMzB,GAE/ChH,EAAI0I,QAAUH,IAAcvB,EAAK0B,MAAQpJ,GACzCU,EAAI2I,qBAAuBJ,IAAcvB,EAAK4B,KAAOtJ,GAGzD,IAAIuJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJ7H,EACA,eACAmC,OAAO4B,KAAK6B,GACTvB,OAAO,SAAUyD,GAChB,OAAOlC,EAAKkC,IAAQ9J,IAErB4I,IAAI,SAAUkB,GACb,OACEtI,EAAuBsI,GACvB,IACAtI,EAAuBoG,EAAKkC,MAG/BjB,KAAK,KACR,SACArC,KAAKD,OAILwD,GACFnK,EAAiBoK,UAAYtF,EAAKxB,EAAe,YAC/C+G,GAAkBF,IAAuB/I,EAEzCkJ,GAAc,CAChBC,QAmqBJ,kBAlqBIH,SAAUC,IASZnK,EAAY,SAAUsK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJrK,EAAKqK,GACLnB,GACE3D,EAAO4E,GAAa,CAClBI,KAAM9J,EACNuD,MAAOqG,EACPG,KAAMzJ,EAAI0J,WAEZxK,EACAE,IAMJ4B,EACEtB,EACA,SAAUiK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASlC,QAAQ3I,IAC3CC,EAAU2K,EAAME,UAGpBxK,GAOF,IAwDIyK,GAxDAC,GAAQtE,KAERuE,GAAW,EAOXC,GAAOnL,EAAiBmL,MAAQrG,EAAKxB,EAAe,QAGpD8H,MA/KsBC,GA+KCrL,EAAiBoL,cA9KvBC,GA+KjBrL,EAAiBoL,WACjBtG,EAAKxB,EAAe,eAAiB9C,GACrCsE,EAAKxB,EAAe,aAAe9C,GACnCsE,EAAKxB,EAAe,gBAAkB9C,EAGtC8K,KACqC,SAAvCxG,EAAKxB,EAAe,iBACpBtD,EAAiBsL,cAAgB/K,GAI/BgL,GACFvL,EAAiBwL,UACjB1G,EAAKxB,EAAe,cACpBuE,GAAY,IAAMlH,EAGhB8K,GAAcxG,EAChBjF,EAAiByL,aAAe3G,EAAKxB,EAAe,iBAIlDyF,GAAc9D,EAChBjF,EAAiB+I,aAAejE,EAAKxB,EAAe,iBAIlDoI,GAAqBzG,EACvBjF,EAAiB0L,oBACf5G,EAAKxB,EAAe,yBAIpBqI,GACF3L,EAAiB2L,gBAAkB7G,EAAKxB,EAAe,mBAGrD6E,GACFnI,EAAiBmI,mBACjBrD,EAAKxB,EAAe,sBAItB,IAEE0H,GAAWzE,GAAsB,KAC7BqF,KAAKC,iBAAiBC,kBAAkBC,SACxC3L,EACJ,MAAO+D,IACPhE,EAAKgE,IAOP,IAAI6H,GAAUjM,EAAOiM,QACjBC,GACFjL,EAAIkL,WACJnM,EAAOoM,aACPpM,EAAOqM,aACPrM,EAAOsM,UACNL,KAAYA,GAAQM,QACrBvM,EAAOwM,YACPxM,EAAOyM,MACPrJ,GACAqE,KAAKC,UAAYD,KAAKC,SAGpBgF,GACFlG,GAAsB,MAAQA,GAAsB,QAElD0F,KAAK3B,GAAY2B,IAAM3L,GAE3B,IAAIkJ,GAAU9D,EAAO4E,GAAa,CAEhCoC,GAAInG,GAAsB,MAAQ/E,EAAYpB,EAE9CK,MAAOS,EAAIyL,UAAYlM,EACvBuK,SAAUA,GACV4B,sBAAuBtM,EACvBuM,QAASzG,KAAeqG,GAAqB5F,KAASzG,GAGtD0M,WAAYvG,GAAsB,MAC9BH,IAAcS,KACdzG,IA0BN,GAvBAoJ,GAAQuD,IAAMxM,EAIVkC,IACF+G,GAAQwD,OAASvK,EAAOuK,OACxBxD,GAAQyD,OAASjL,EAAUS,EAAOwK,SAS/B3L,EAAI4L,SAAS/M,EAAK,4CAInBkK,KAAoBjJ,IACtBoI,GAAQ2D,kBAAoB/L,IAGzBgK,IAAcrK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBkC,EAAU,SAK7B,GAAlC7B,EAAiBwH,QAAQ,OACxB,aAAaxF,KAAKhC,IACnB+I,IAEDhK,EACE,mBACEiB,EACA,SACA6B,EACA,0BAON,IACImK,GA2DAC,GA5DA5D,GAAO,GAGP6D,GAAc,WAKhB,OAFEtN,EAAiBuN,UAAYzI,EAAKxB,EAAe,aAGzBhC,EAAIiM,UAAY,IACrC1I,QAAQzD,EAAkBiJ,IAC1BxF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAASzE,GAKjCmN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKlB,MACDrG,IAAegH,IAAiBQ,MAApC,CAEA,IAAIC,EAASnI,EAAO4E,GAAa,CAC/BI,KAAM,SACNoD,YAAaH,EAAOD,EAAKlE,GAAQqD,UAenC,GAXItG,GAAsB,OACxBsH,EAAOE,SAAWvG,KAAKwG,OAAOrH,KAAQsE,GAAQuC,IAnhBnC,MAqhBbA,GAAW,EACXvC,GAAQtE,KAGJJ,GAAsB,UACxBsH,EAAO3C,SAAW1D,KAAKyG,IAAI,EAAG/C,GAAUgD,OAGtCP,IAAS3M,EAAImN,WAEf9E,GAASwE,EAAQzN,EAAcE,QAE/B,IACEU,EAAImN,WAAWC,KAAKpN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU6L,IAC3D,MAAOQ,GAEPhF,GAASwE,EAAQzN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAIgN,QACA,KAAOxL,KAAY/C,GAAS0N,KAClCJ,GAAc1G,MACT6G,IAAY7G,KAAQ0G,IAE7B9M,GAGF2B,EAAqBY,EAAU2K,GAAalN,GAE5C,IAAIgO,GAAOjN,EAAIiN,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuBnM,EAAgBQ,IAAiB,EACxD4L,EAASjH,KAAKyG,IAChBM,GAAK5L,IAAiB,EACtB4L,GAAK3L,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO4E,KAAKkH,IACV,IAKI,EAJJlH,KAAKwG,MACF,MAAQ3L,EAAgBsM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOtK,IAEP,OADAhE,EAAKgE,IACE,IAIXjC,EAAqB,OAAQ,WAC3BgJ,GAAWgD,KACXhM,EACEM,EACA,WACM0I,GAAWgD,OAAYhD,GAAWgD,OAExC3N,KAQJ,IAgCIqO,GAuCAC,GAAUC,GAvEVlB,GAAU,SAAUmB,GACtB,IAAIpE,EAAO,GAIX,IACEA,EAAOoE,GAAajN,EAAuBZ,EAAI0J,UAC/C,MAAOzG,IACPhE,EAAKgE,IAGP,IAAI6K,EAAyBjP,EAAO4L,IACpC,GAAIjE,GAAWsH,GACb,IACErE,EAAOqE,EAAuBrL,KAAK5D,EAAQ,CAAE4K,KAAMA,KAAWA,EAC9D,MAAOxG,IACPF,EAAe,OAAQE,IAK3B,IAhZiB,SAAUwG,GAC3B,IAAK,IAAIhC,KAAK8C,GAAa,CACzB,IAAIwD,EAAgBxD,GAAY9C,GAChC,GAAKsG,EAAL,CAGA,IAAIC,EA1PI,KA2PND,EAAc,GAAcA,EA3PtB,IA2P8CA,EAEtD,GACEC,IAAevE,GACf,IAAIjE,OACF,IAAM/B,EAAYuK,GAAYrK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKuH,GAEP,OAAOrK,GAEX,OAAOC,EA8XH4O,CAAaxE,GAQjB,MAFY,QAARQ,IAAkBjK,EAAIkO,OAAMzE,GAAQzJ,EAAIkO,KAAK9J,MAAM,KAAK,IAErDqF,EAPLxK,EAAKuB,EAAiB,YAAciJ,IAmDpC0E,GAAW,SACbC,EACAC,EACAxH,EACAyH,IAEKA,GAAe9H,GAAWK,KAAWyH,EAAczH,GACxD,IACI0H,EAGEC,EAJFpG,EAAW5B,GAAW8H,GAAeA,EAAc,aAEnD/K,EAAS8K,KAAgD,EAA9BA,EAAc3G,QAAQ,OAGnD2G,GADIG,EAAQH,EAAcjK,MAAM,MACVqK,QACtBF,EAAc,IAAMC,EAAMzG,KAAK,MAGjC,IAAI0B,EAAOiD,GAAQ2B,GAUnB,GARK5E,GAASyC,KAAgBhH,KAE5BoD,GAAQqD,QAAUJ,GAAqB5F,KAASzG,EAC5CoJ,GAAQsD,aAAe1G,KAAYoD,GAAQsD,WAAajG,MAC5DT,GAAahG,GAIVuK,GAAQyC,IAAgBzC,EAA7B,CAEAyC,GAAezC,EACflB,GAAKkB,KAAOA,EAGRpE,GAAsB,OACxBkD,GAAKmG,eACHpI,KAAKyG,IAAI5L,EAA2B,aAAK,EAAGtC,EAAO8P,YAAc,IACjE,KACFpG,GAAKqG,gBACHtI,KAAKyG,IACH5L,EAAgBQ,IAAiB,EACjC9C,EAAOgQ,aAAe,IACnB,MAILxJ,GAAsB,MACpBvF,EAAIsB,KAAWmH,GAAKnH,GAAYtB,EAAIsB,IAItCe,GAAUkD,GAAsB,QAClCkD,GAAKuG,aAAe3M,EAAO4M,MAC3BxG,GAAKyG,cAAgB7M,EAAOoL,QAI9B,IAII0B,EAJAC,EAAOrQ,EAAOsQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG5F,KAC/D,MAAOvG,IACPhE,EAAKgE,IAGP2K,GAAgBqB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBvH,QAAQuH,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAG1H,QAAQwH,EAAKE,GAAgB5F,MAGxC,IAAI8F,EAA0BjD,GAC1BA,GAASjI,MApwBH,KAowBgB,GACtBlF,EACJyO,GAAWtB,IACgD,EAAvD7B,GAAmB9C,QAAQ4H,IAC3BA,GAA2BpP,EAC3Bb,EAGJkJ,GAAKgH,OACH,QAAQrN,KAAKkK,OAAkBgC,GAAeR,GAC1CvO,GACCsO,GAEP9G,EAAWD,GAAeC,EAAU,CAClC2C,KAAMhK,EACNiK,KAAMlB,GAAKkB,OAGb,IAAI+F,EAAsB,WACxB/O,EAA2BrB,EAC3B,IAAIqQ,EACFrB,GAAeR,KAAkBvI,GAAsB,MAvI1C,SACjB+I,EACAsB,EACA/B,EACApG,EACAV,EACAuB,GAEIgG,GAAa7B,GAAY,GAAKjE,GAAQqD,QAASvM,GACnD,IAAIuQ,EAAuB,IAAV3N,EAAckD,GAAahG,EAC5CoJ,GAAQqD,QACNgE,IAAepE,GAAqB5F,KAASzG,GAE/C,IAAI0Q,EAAczG,GAAkBuD,KAChCmD,EAAQ1I,GAAeuI,EAAkBnI,GAE7CY,GACE,CACEqE,GAAIlE,GAAQqD,QACZiB,YAAa+C,EACbnG,KAAMmG,EAAa,SAAWnQ,EAC9B6M,UAAWqD,GAAoB/B,EAAWtB,GAAW,KACrDwD,MAAOA,EACP1K,EAAGA,GAEH0B,SAAU/F,EAAU+F,IAEtBuB,GAGFsF,GAAmBrB,GACnBA,GAAWuD,EAEX5N,IAuGE8N,CACE1B,EACAqB,EACA9B,GACAY,EACA1H,EACAuB,IAIJ,GAAK3H,EAmBH+O,SAjBA,IACMjO,GAAUiF,GAAWjF,EAAOwO,sBAC9BxO,EACGwO,qBAAqB,CAAClO,EAAcC,IACpCkO,KAAK,SAAUC,GACd3H,GAAQ4H,QAAUD,EAAkBpO,GACpCyG,GAAQ6H,WAAaF,EAAkBnO,GACvC0N,MAEDY,SAAMZ,GAETA,IAEF,MAAOrC,GACPqC,OAWFa,GAAMxR,EAAOyR,QACbC,GAAeF,GAAMA,GAAIG,UAAYtR,EACrCuR,GAAM5R,EAAO6R,cACbC,GAAgB,YAIhBvG,IAAemG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB7G,GAoBAmH,IAlBrB,WACL,IAEIhH,EAFAjF,EAAMhC,UACNoO,EAAKD,GAAK/N,MAAMiO,KAAMrM,GAY1B,OAVI8B,GAAWoK,OACbjH,EAAQ,IAAIiH,MAAMpH,KAIlBG,EAAQvJ,EAAI4Q,YAAY,UAClBC,UAAUzH,GAAMpK,EAASA,GAEjCuK,EAAMjH,UAAYgC,EAClB+L,GAAI9G,GACGmH,IAMX9P,EACE2P,GACA,WACExC,GAAS,IAEX9O,GAGF2B,EACE,WACA,WACEmN,GAAS,IAEX9O,IAKA+K,IAAuB,QAARH,IAAkB,iBAAkBpL,GACrDmC,EACE,aACA,WACEmN,GAAS,IAEX9O,GAIA+K,IAAa+D,KAEjBtP,EAAOqS,YAAc,SAAUzH,EAAM5C,EAAUuB,GAC7C+F,GAAS,EAAG1E,EAAM5C,EAAUuB,IAQ9B,IAAI+I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUzH,EAAO9C,EAAUyH,IACpCA,GAAe9H,GAAWK,KAAWyH,EAAczH,GAExD,IAAIwK,EAAkB7K,GAAWmD,GAC7BvB,EAAW5B,GAAW8H,GAAeA,EAAc,aACnDgD,SAAmB3H,EAEvB,GAAIwH,GAAWzJ,QAAQ4J,GAAa,IAAMD,EAExC,OADAtO,EAAesH,GAAmB5K,EAAY,aAAe6R,GACtDlJ,IAGT,IACE,GAAIiJ,EAAiB,CACnB,IAAIE,EAAc5H,IAClB,GAAIwH,GAAWzJ,eAAe6J,GAAe,EAK3C,OAJAxO,EACEsH,GACAV,EAAQ,uBAAyB4H,GAE5BnJ,IAETuB,EAAQ4H,GAEV,MAAOtO,IAEP,OADAF,EAAesH,GAAmBpH,IAC3BmF,IAGTuB,GAAS,GAAKA,GAAOhG,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAI6N,EAAc,CAAEhI,KAAM/J,EAAWkK,MAAOA,GACxC8H,GAAa7D,IAAiB5L,EAAQ,GAGtCkD,IAAegH,IAAiBQ,OAClC8E,EAAY7F,QAAUzM,EACtBsS,EAAY5F,WAAa1M,GAG3B2H,EAAWD,GAAeC,EAAU2K,GAEhC7H,GACFxB,GACE3D,EAAOgN,EAAa,CAClBhF,GAAI7G,KACJkK,MAAO1I,IAAgBsK,GACvBpF,UACGoF,GAAa9D,KAAatI,GAAsB,KAC7CqI,GACA,KAEN7G,SAAU/F,EAAU+F,KAEtBuB,IAKFsJ,GAAmB,SAAU/H,EAAO9C,EAAUuB,GAChDgJ,GAAUzH,EAAO9C,EAAUuB,IAIxBvJ,EAAOwL,MACVxL,EAAOwL,IAAqBqH,IAE9B,IAAIC,GAAY9S,EAAOwL,IAGnBuH,GAAQD,IAAaA,GAAUrK,EAAIqK,GAAUrK,EAAI,GAMrD,IAAK,IAAIqC,MAHT9K,EAAOwL,IAAqBqH,GAGVE,GACZ1O,EAAQ0O,GAAOjI,MACjB1F,MAAMC,QAAQ0N,GAAMjI,KAChByH,GAAUtO,MAAM,KAAM8O,GAAMjI,KAC5ByH,GAAUQ,GAAMjI,MAGxB,MAAOwD,IACPnO,EAAUmO,IAnJY,IAAU3D,GACxBqH,GAnoBkB1G,GA/N9B,CAu/BEtL,OACA,uBACA"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/hello.js b/dist/latest/hello.js index 837a855..0b9c3f9 100644 --- a/dist/latest/hello.js +++ b/dist/latest/hello.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 0b99) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; cfa6) */ -!function(h,e,t,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,q="https://queue."+t,M=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+t+'"]');m=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,e)};var F=function(e,t){m("Error in your "+e+" function:",t)},L=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},W=function(e){return"string"==typeof e},G=function(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(e,t){return e&&e.getAttribute("data-"+t)},Y=function(e){return Array.isArray(e)?e:W(e)&&e.length?e.split(/, ?/):[]},Z=function(e){return e&&e.constructor===Object},K=function(){for(var e={},t=arguments,n=0;n>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},oe=function(e){return"function"==typeof e},ce="namespace",se=e[ce]||J(z,ce)||"sa",ue=function(e,t){var n=h[se+"_metadata"];Z(n)&&(e=K(e,n));var r=h[Me];if(!oe(r))return Me&&m(Me+" not found, set window."+Me),e;try{return K(e,r.call(h,K(e,t)))}catch(a){F("metadata",a)}},le=e.strictUtm||J(z,"strict-utm")==r,pe=function(i,e){te=!i&&re("q")?"":y;var t=(e||s.search).slice(1).split("&").filter(function(e){var t=e.indexOf("=");te!==y&&0>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},oe=function(e){return"function"==typeof e},ce="namespace",se=e[ce]||J(z,ce)||"sa",ue=function(e,t){var n=g[se+"_metadata"];Z(n)&&(e=K(e,n));var r=g[Me];if(!oe(r))return Me&&m(Me+" not found, set window."+Me),e;try{return K(e,r.call(g,K(e,t)))}catch(a){F("metadata",a)}},le=e.strictUtm||J(z,"strict-utm")==r,pe=function(i,e){te=!i&&re("q")?"":_;var t=(e||s.search).slice(1).split("&").filter(function(e){var t=e.indexOf("=");te!==_&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"hello.source.js","sources":["hello.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/latest.dev.js b/dist/latest/latest.dev.js index 1f841e8..a588428 100644 --- a/dist/latest/latest.dev.js +++ b/dist/latest/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; a763; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; 5e3b; v12) */ /* eslint-env browser */ (function ( @@ -686,41 +686,39 @@ var previousReferrer; - // Send page view and append data to it - var sendPageView = function ( + // Capture each accepted pageview before waiting for client hints. + var preparePageView = function ( isPushState, deleteSourceInfo, sameSite, search, - metadata, - callback + metadata ) { if (isPushState) sendOnLeave("" + payload.page_id, trueVar); var originalId = pages === 0 ? pageLoadId : undefinedVar; payload.page_id = originalId || (collectDataOnLeave ? uuid() : undefinedVar); - var currentPage = definedHostname + getPath(); + var currentPage = definedHostname + page.path; var query = getQueryParams(deleteSourceInfo, search); - sendData( - { - id: payload.page_id, - original_id: originalId, - type: originalId ? "append" : pageviewText, - referrer: !deleteSourceInfo || sameSite ? referrer : null, - query: query, - k: k, - - metadata: stringify(metadata), - }, - callback - ); + var data = assign(page, { + id: payload.page_id, + page_id: payload.page_id, + original_id: originalId, + type: originalId ? "append" : pageviewText, + referrer: !deleteSourceInfo || sameSite ? referrer : null, + query: query, + k: k, + + metadata: stringify(metadata), + }); previousReferrer = referrer; referrer = currentPage; pages++; + return data; }; var sameSite, userNavigated; @@ -819,18 +817,18 @@ path: page.path, }); + var delSrc = isPushState || userNavigated || !collectMetricByString("r"); + var pageviewData = preparePageView( + isPushState, + delSrc, // r = referrers + sameSite, + querySearch, + metadata + ); + var triggerSendPageView = function () { fetchedHighEntropyValues = trueVar; - var delSrc = - isPushState || userNavigated || !collectMetricByString("r"); - sendPageView( - isPushState, - delSrc, // r = referrers - sameSite, - querySearch, - metadata, - callback - ); + sendData(pageviewData, callback); }; if (!fetchedHighEntropyValues) { diff --git a/dist/latest/latest.js b/dist/latest/latest.js index c864cb9..3f30d11 100644 --- a/dist/latest/latest.js +++ b/dist/latest/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; f5af; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; 2354; v12) */ -!function(h,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,q="https://queue."+e,M=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[Mt];if(!ot(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},oe=function(e){return"function"==typeof e},ce="namespace",se=e[ce]||J(z,ce)||"sa",ue=function(e,t){var n=g[se+"_metadata"];Z(n)&&(e=K(e,n));var r=g[Me];if(!oe(r))return Me&&m(Me+" not found, set window."+Me),e;try{return K(e,r.call(g,K(e,t)))}catch(a){F("metadata",a)}},le=e.strictUtm||J(z,"strict-utm")==r,pe=function(i,e){te=!i&&re("q")?"":_;var t=(e||s.search).slice(1).split("&").filter(function(e){var t=e.indexOf("=");te!==_&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAAaC,iBAA0BpC,EACvCqC,EAAkBhB,EAAIgB,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAAS1B,EAAI2B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK7B,KAAe,WAAW6B,KAAK7B,GACxD8B,EAASvD,EAAOuD,OAIhBC,EACFjC,EAAIkC,eAAiBlC,EAAImC,cAAc,gBAAkBxD,EAAU,MAOrEE,EAAO,WAEL,IAAIuD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK/C,EAAIV,KAAMU,EAAK6C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnCjE,EAAK,iBAAmBgE,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWlG,EAAOmG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKpG,GAAkBsF,OAG5DtF,EAAmB2F,EAAO3F,EAAkBiG,GAExCE,GAAahG,EAAK,WAAYH,GAGlC,IAAIqG,GACFrG,EAAiBqG,YAActB,EAAKxB,EAAe,gBAE7B,iBAAf8C,IACN,yEAAyEhD,KACxEgD,MAGFA,GAAajG,GAIf,IA+EIkG,GA/EAC,GAAgBrB,EAClBlF,EAAiBuG,eAAiBxB,EAAKxB,EAAe,mBAGpDiD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU7B,GAC7B,OAAO,IAAI8B,OAAO,IAAMF,GAAoBpD,KAAKwB,KAChDS,QAIHsB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAehH,EAAOiH,QAAUjH,EAAOkH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOnD,GACP,OAAO8C,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF9H,EAAiB6H,KACjB9C,EAAKxB,EAAesE,KAmzBxB,KAhzBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBnI,EAAO+H,GAAY,aACpCtC,EAAS0C,KAAiBF,EAAWrC,EAAOqC,EAAUE,IAC1D,IAAIC,EAA4BpI,EAAOqI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACFjI,EACEiI,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOrC,EACLqC,EACAG,EAA0BvE,KAAK7D,EAAQ4F,EAAOqC,EAAUC,KAE1D,MAAO7D,GACPF,EAAe,WAAYE,KAU3BiE,GACFrI,EAAiBqI,WACjBtD,EAAKxB,EAAe,eAAiB/C,EAInC8H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAKjG,EACvD,IAAIkI,GAAKD,GAAmBtH,EAAIwH,QAC7B/E,MAAM,GACN4B,MAAM,KACNmB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM/F,GAAgB,EAAJqI,GAASD,EAAShF,MAAMiF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAShF,MAAM,EAAGiF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIrE,GAAasE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAY1D,OAAe/E,EAInC,IAAIoG,OAAOwC,EAAO,KAAK9F,KAAKsF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKlG,EACFqI,GAAKrI,GA+BVgJ,GAAiBtB,GAAY,UACjC,GAAI/H,EAAOqJ,KAAmB9I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOsJ,gBAAkB/I,EACzBP,EAAOqJ,IAAkB9I,EAOzB,IAAIgJ,GAAW,SAAUrB,EAAMsB,EAAUC,GACvCvB,EAAOuB,EAAevB,EAAOtC,EAAO8D,GAASC,GAAMzB,GAE/CjH,EAAI2I,QAAUH,IAAcvB,EAAK0B,MAAQrJ,GACzCU,EAAI4I,qBAAuBJ,IAAcvB,EAAK4B,KAAOvJ,GAGzD,IAAIwJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJ9H,EACA,eACAoC,OAAO4B,KAAK6B,GACTvB,OAAO,SAAUyD,GAChB,OAAOlC,EAAKkC,IAAQ/J,IAErB6I,IAAI,SAAUkB,GACb,OACEvI,EAAuBuI,GACvB,IACAvI,EAAuBqG,EAAKkC,MAG/BjB,KAAK,KACR,SACArC,KAAKD,OAILwD,GACFpK,EAAiBqK,UAAYtF,EAAKxB,EAAe,YAC/C+G,GAAkBF,IAAuBhJ,EAEzCmJ,GAAc,CAChBC,QAiqBJ,gBAhqBIH,SAAUC,IASZpK,EAAY,SAAUuK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJtK,EAAKsK,GACLnB,GACE3D,EAAO4E,GAAa,CAClBI,KAAM/J,EACNwD,MAAOqG,EACPG,KAAM1J,EAAI2J,WAEZzK,EACAE,IAMJ4B,EACEtB,EACA,SAAUkK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASlC,QAAQ5I,IAC3CC,EAAU4K,EAAME,UAGpBzK,GAOF,IAwDI0K,GAxDAC,GAAQtE,KAERuE,GAAW,EAOXC,GAAOpL,EAAiBoL,MAAQrG,EAAKxB,EAAe,QAGpD8H,MA/KsBC,GA+KCtL,EAAiBqL,cA9KvBC,GA+KjBtL,EAAiBqL,WACjBtG,EAAKxB,EAAe,eAAiB/C,GACrCuE,EAAKxB,EAAe,aAAe/C,GACnCuE,EAAKxB,EAAe,gBAAkB/C,EAGtC+K,KACqC,SAAvCxG,EAAKxB,EAAe,iBACpBvD,EAAiBuL,cAAgBhL,GAI/BiL,GACFxL,EAAiByL,UACjB1G,EAAKxB,EAAe,cACpBuE,GAAY,IAAMnH,EAGhB+K,GAAcxG,EAChBlF,EAAiB0L,aAAe3G,EAAKxB,EAAe,iBAIlDyF,GAAc9D,EAChBlF,EAAiBgJ,aAAejE,EAAKxB,EAAe,iBAIlDoI,GAAqBzG,EACvBlF,EAAiB2L,oBACf5G,EAAKxB,EAAe,yBAIpBqI,GACF5L,EAAiB4L,gBAAkB7G,EAAKxB,EAAe,mBAGrD6E,GACFpI,EAAiBoI,mBACjBrD,EAAKxB,EAAe,sBAItB,IAEE0H,GAAWzE,GAAsB,KAC7BqF,KAAKC,iBAAiBC,kBAAkBC,SACxC5L,EACJ,MAAOgE,IACPjE,EAAKiE,IAOP,IAAI6H,GAAUlM,EAAOkM,QACjBC,GACFlL,EAAImL,WACJpM,EAAOqM,aACPrM,EAAOsM,aACPtM,EAAOuM,UACNL,KAAYA,GAAQM,QACrBxM,EAAOyM,YACPzM,EAAO0M,MACPrJ,GACAqE,KAAKC,UAAYD,KAAKC,SAGpBgF,GACFlG,GAAsB,MAAQA,GAAsB,QAElD0F,KAAK3B,GAAY2B,IAAM5L,GAE3B,IAAImJ,GAAU9D,EAAO4E,GAAa,CAEhCoC,GAAInG,GAAsB,MAAQhF,EAAYpB,EAE9CK,MAAOS,EAAImB,UAAY5B,EACvBwK,SAAUA,GACV2B,sBAAuBtM,EACvBuM,QAASxG,KAAeqG,GAAqB5F,KAAS1G,GAGtD0M,WAAYtG,GAAsB,MAC9BH,IAAcS,KACd1G,IA0BN,GAvBAqJ,GAAQsD,IAAMxM,EAIVmC,IACF+G,GAAQuD,OAAStK,EAAOsK,OACxBvD,GAAQwD,OAASjL,EAAUU,EAAOuK,SAS/B3L,EAAI4L,SAAS/M,EAAK,4CAInBmK,KAAoBlJ,IACtBqI,GAAQ0D,kBAAoB/L,IAGzBiK,IAActK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBmC,EAAU,SAK7B,GAAlC9B,EAAiByH,QAAQ,OACxB,aAAaxF,KAAKjC,IACnBgJ,IAEDjK,EACE,mBACEiB,EACA,SACA8B,EACA,0BAON,IACIkK,GA2DAC,GA5DA3D,GAAO,GAGP4D,GAAc,WAKhB,OAFEtN,EAAiBuN,UAAYxI,EAAKxB,EAAe,aAGzBjC,EAAIiM,UAAY,IACrCzI,QAAQ1D,EAAkBkJ,IAC1BxF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS1E,GAKjCmN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKjB,MACDrG,IAAe+G,IAAiBQ,MAApC,CAEA,IAAIC,EAASlI,EAAO4E,GAAa,CAC/BI,KAAM,SACNmD,YAAaH,EAAOD,EAAKjE,GAAQoD,UAenC,GAXIrG,GAAsB,OACxBqH,EAAOE,SAAWtG,KAAKuG,OAAOpH,KAAQsE,GAAQsC,IAnhBnC,MAqhBbA,GAAW,EACXtC,GAAQtE,KAGJJ,GAAsB,UACxBqH,EAAO1C,SAAW1D,KAAKwG,IAAI,EAAG9C,GAAU+C,OAGtCP,IAAS3M,EAAImN,WAEf7E,GAASuE,EAAQzN,EAAcE,QAE/B,IACEU,EAAImN,WAAWC,KAAKpN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU6L,IAC3D,MAAOQ,GAEP/E,GAASuE,EAAQzN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAIgN,QACA,KAAOvL,KAAYhD,GAAS0N,KAClCJ,GAAczG,MACT4G,IAAY5G,KAAQyG,IAE7B9M,GAGF2B,EAAqBa,EAAU0K,GAAalN,GAE5C,IAAIgO,GAAOjN,EAAIiN,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuBlM,EAAgBQ,IAAiB,EACxD2L,EAAShH,KAAKwG,IAChBM,GAAK3L,IAAiB,EACtB2L,GAAK1L,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO4E,KAAKiH,IACV,IAKI,EAJJjH,KAAKuG,MACF,MAAQ1L,EAAgBqM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOrK,IAEP,OADAjE,EAAKiE,IACE,IAIXlC,EAAqB,OAAQ,WAC3BiJ,GAAW+C,KACXhM,EACEO,EACA,WACM0I,GAAW+C,OAAY/C,GAAW+C,OAExC3N,KAQJ,IAgCIqO,GAqCAC,GAAUC,GArEVlB,GAAU,SAAUmB,GACtB,IAAInE,EAAO,GAIX,IACEA,EAAOmE,GAAajN,EAAuBZ,EAAI2J,UAC/C,MAAOzG,IACPjE,EAAKiE,IAGP,IAAI4K,EAAyBjP,EAAO6L,IACpC,GAAIjE,GAAWqH,GACb,IACEpE,EAAOoE,EAAuBpL,KAAK7D,EAAQ,CAAE6K,KAAMA,KAAWA,EAC9D,MAAOxG,IACPF,EAAe,OAAQE,IAK3B,IAhZiB,SAAUwG,GAC3B,IAAK,IAAIhC,KAAK8C,GAAa,CACzB,IAAIuD,EAAgBvD,GAAY9C,GAChC,GAAKqG,EAAL,CAGA,IAAIC,EA1PI,KA2PND,EAAc,GAAcA,EA3PtB,IA2P8CA,EAEtD,GACEC,IAAetE,GACf,IAAIjE,OACF,IAAM/B,EAAYsK,GAAYpK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKuH,GAEP,OAAOtK,GAEX,OAAOC,EA8XH4O,CAAavE,GAQjB,MAFY,QAARQ,IAAkBlK,EAAIkO,OAAMxE,GAAQ1J,EAAIkO,KAAK7J,MAAM,KAAK,IAErDqF,EAPLzK,EAAKuB,EAAiB,YAAckJ,IAiDpCyE,GAAW,SACbC,EACAC,EACAvH,EACAwH,IAEKA,GAAe7H,GAAWK,KAAWwH,EAAcxH,GACxD,IACIyH,EAGEC,EAJFnG,EAAW5B,GAAW6H,GAAeA,EAAc,aAEnD9K,EAAS6K,KAAgD,EAA9BA,EAAc1G,QAAQ,OAGnD0G,GADIG,EAAQH,EAAchK,MAAM,MACVoK,QACtBF,EAAc,IAAMC,EAAMxG,KAAK,MAGjC,IAAI0B,EAAOgD,GAAQ2B,GAUnB,GARK3E,GAASwC,KAAgB/G,KAE5BoD,GAAQoD,QAAUH,GAAqB5F,KAAS1G,EAC5CqJ,GAAQqD,aAAezG,KAAYoD,GAAQqD,WAAahG,MAC5DT,GAAajG,GAIVwK,GAAQwC,IAAgBxC,EAA7B,CAEAwC,GAAexC,EACflB,GAAKkB,KAAOA,EAGRpE,GAAsB,OACxBkD,GAAKkG,eACHnI,KAAKwG,IAAI3L,EAA2B,aAAK,EAAGvC,EAAO8P,YAAc,IACjE,KACFnG,GAAKoG,gBACHrI,KAAKwG,IACH3L,EAAgBQ,IAAiB,EACjC/C,EAAOgQ,aAAe,IACnB,MAILvJ,GAAsB,MACpBxF,EAAIuB,KAAWmH,GAAKnH,GAAYvB,EAAIuB,IAItCe,GAAUkD,GAAsB,QAClCkD,GAAKsG,aAAe1M,EAAO2M,MAC3BvG,GAAKwG,cAAgB5M,EAAOmL,QAI9B,IAII0B,EAJAC,EAAOrQ,EAAOsQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG3F,KAC/D,MAAOvG,IACPjE,EAAKiE,IAGP0K,GAAgBqB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBtH,QAAQsH,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGzH,QAAQuH,EAAKE,GAAgB3F,MAGxC,IAAI6F,EAA0BjD,GAC1BA,GAAShI,MAlwBH,KAkwBgB,GACtBnF,EACJyO,GAAWtB,IACgD,EAAvD5B,GAAmB9C,QAAQ2H,IAC3BA,GAA2BpP,EAC3Bb,EAGJmJ,GAAK+G,OACH,QAAQpN,KAAKiK,OAAkBgC,GAAeR,GAC1CvO,GACCsO,GAEP7G,EAAWD,GAAeC,EAAU,CAClC2C,KAAMjK,EACNkK,KAAMlB,GAAKkB,OAGb,IACI8F,EAnIgB,SACpBpB,EACAqB,EACA9B,EACAnG,EACAV,GAEIsH,GAAa7B,GAAY,GAAKhE,GAAQoD,QAASvM,GACnD,IAAIsQ,EAAuB,IAAVzN,EAAckD,GAAajG,EAC5CqJ,GAAQoD,QACN+D,IAAelE,GAAqB5F,KAAS1G,GAE/C,IAAIyQ,EAAcvG,GAAkBZ,GAAKkB,KACrCkG,EAAQxI,GAAeqI,EAAkBjI,GAEzCT,EAAOtC,EAAO+D,GAAM,CACtBgE,GAAIjE,GAAQoD,QACZA,QAASpD,GAAQoD,QACjBiB,YAAa8C,EACbjG,KAAMiG,EAAa,SAAWlQ,EAC9B6M,UAAWoD,GAAoB9B,EAAWtB,GAAW,KACrDuD,MAAOA,EACPxK,EAAGA,GAEH0B,SAAUhG,EAAUgG,KAOtB,OAJA4G,GAAmBrB,GACnBA,GAAWsD,EAEX1N,IACO8E,EAoGY8I,CACjBzB,EAFWA,GAAeR,KAAkBtI,GAAsB,KAIlEqI,GACAY,EACAzH,GAGEgJ,EAAsB,WACxBrP,EAA2BrB,EAC3BgJ,GAASoH,EAAcnH,IAGzB,GAAK5H,EAmBHqP,SAjBA,IACMtO,GAAUiF,GAAWjF,EAAOuO,sBAC9BvO,EACGuO,qBAAqB,CAACjO,EAAcC,IACpCiO,KAAK,SAAUC,GACd1H,GAAQ2H,QAAUD,EAAkBnO,GACpCyG,GAAQ4H,WAAaF,EAAkBlO,GACvC+N,MAEDM,SAAMN,GAETA,IAEF,MAAO3C,GACP2C,OAWFO,GAAMxR,EAAOyR,QACbC,GAAeF,GAAMA,GAAIG,UAAYtR,EACrCuR,GAAM5R,EAAO6R,cACbC,GAAgB,YAIhBtG,IAAekG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB5G,GAoBAkH,IAlBrB,WACL,IAEI/G,EAFAjF,EAAMhC,UACNmO,EAAKD,GAAK9N,MAAMgO,KAAMpM,GAY1B,OAVI8B,GAAWmK,OACbhH,EAAQ,IAAIgH,MAAMnH,KAIlBG,EAAQxJ,EAAI4Q,YAAY,UAClBC,UAAUxH,GAAMrK,EAASA,GAEjCwK,EAAMjH,UAAYgC,EAClB8L,GAAI7G,GACGkH,IAMX9P,EACE2P,GACA,WACExC,GAAS,IAEX9O,GAGF2B,EACE,WACA,WACEmN,GAAS,IAEX9O,IAKAgL,IAAuB,QAARH,IAAkB,iBAAkBrL,GACrDmC,EACE,aACA,WACEmN,GAAS,IAEX9O,GAIAgL,IAAa8D,KAEjBtP,EAAOqS,YAAc,SAAUxH,EAAM5C,EAAUuB,GAC7C8F,GAAS,EAAGzE,EAAM5C,EAAUuB,IAQ9B,IAAI8I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUxH,EAAO9C,EAAUwH,IACpCA,GAAe7H,GAAWK,KAAWwH,EAAcxH,GAExD,IAAIuK,EAAkB5K,GAAWmD,GAC7BvB,EAAW5B,GAAW6H,GAAeA,EAAc,aACnDgD,SAAmB1H,EAEvB,GAAIuH,GAAWxJ,QAAQ2J,GAAa,IAAMD,EAExC,OADArO,EAAesH,GAAmB7K,EAAY,aAAe6R,GACtDjJ,IAGT,IACE,GAAIgJ,EAAiB,CACnB,IAAIE,EAAc3H,IAClB,GAAIuH,GAAWxJ,eAAe4J,GAAe,EAK3C,OAJAvO,EACEsH,GACAV,EAAQ,uBAAyB2H,GAE5BlJ,IAETuB,EAAQ2H,GAEV,MAAOrO,IAEP,OADAF,EAAesH,GAAmBpH,IAC3BmF,IAGTuB,GAAS,GAAKA,GAAOhG,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAI4N,EAAc,CAAE/H,KAAMhK,EAAWmK,MAAOA,GACxC6H,GAAa7D,IAAiB3L,EAAQ,GAGtCkD,IAAe+G,IAAiBQ,OAClC8E,EAAY7F,QAAUzM,EACtBsS,EAAY5F,WAAa1M,GAG3B4H,EAAWD,GAAeC,EAAU0K,GAEhC5H,GACFxB,GACE3D,EAAO+M,EAAa,CAClBhF,GAAI5G,KACJgK,MAAOxI,IAAgBqK,GACvBpF,UACGoF,GAAa9D,KAAarI,GAAsB,KAC7CoI,GACA,KAEN5G,SAAUhG,EAAUgG,KAEtBuB,IAKFqJ,GAAmB,SAAU9H,EAAO9C,EAAUuB,GAChD+I,GAAUxH,EAAO9C,EAAUuB,IAIxBxJ,EAAOyL,MACVzL,EAAOyL,IAAqBoH,IAE9B,IAAIC,GAAY9S,EAAOyL,IAGnBsH,GAAQD,IAAaA,GAAUpK,EAAIoK,GAAUpK,EAAI,GAMrD,IAAK,IAAIqC,MAHT/K,EAAOyL,IAAqBoH,GAGVE,GACZzO,EAAQyO,GAAOhI,MACjB1F,MAAMC,QAAQyN,GAAMhI,KAChBwH,GAAUrO,MAAM,KAAM6O,GAAMhI,KAC5BwH,GAAUQ,GAAMhI,MAGxB,MAAOuD,IACPnO,EAAUmO,IAnJY,IAAU1D,GACxBoH,GAjoBkBzG,GA/N9B,CAq/BEvL,OACA,uBACA"} \ No newline at end of file diff --git a/dist/latest/light.js b/dist/latest/light.js index c7d2024..c3a4d03 100644 --- a/dist/latest/light.js +++ b/dist/latest/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; f045; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; 10ca; v12) */ -!function(l,e,t,f){try{var m=undefined,n="https:",r=l.console,a="doNotTrack",g=l.navigator,d=l.location,h=d.host,i=l.document,o=g.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,p=decodeURIComponent,u=JSON.stringify,y=l.addEventListener,_="https://queue."+t,b=(i.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,E=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),$=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||x($,V)||"sa",C=e.strictUtm||"true"==x($,"strict-utm"),T=B+"_loaded";if(1==l[T])return f(c+"twice");l.sa_event_loaded=!0,l[T]=!0;var F,H=function(t,e,n){t=n?t:A(M,Z,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||x($,"hostname"),z=L||h,J={version:"cdn_light_12",hostname:z};e.mode||x($,"mode");try{F=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}E&&(J.bot=!0);var M=A(J,{ua:o,https:d.protocol==n,timezone:F,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!1,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==h&&(M.hostname_original=h),a in g&&"1"==g[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||L||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||x($,"referrer")||i.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,K=function(e,t){if(0,!N||P||X()){var n=A(J,{type:"append",original_id:t?e:M.page_id});if(t||!g.sendBeacon)H(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",u(n))}catch(r){H(n,0,!0)}}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:m;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||m);H({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);q(t)&&-1>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||x($,V)||"sa",C=e.strictUtm||"true"==x($,"strict-utm"),T=B+"_loaded";if(1==f[T])return g(c+"twice");f.sa_event_loaded=!0,f[T]=!0;var F,H=function(t,e,n){t=n?t:A(M,Z,t),h.brave&&!n&&(t.brave=!0),h._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||x($,"hostname"),z=L||v,J={version:"cdn_light_12",hostname:z};e.mode||x($,"mode");try{F=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){g(ee)}E&&(J.bot=!0);var M=A(J,{ua:o,https:d.protocol==n,timezone:F,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!1,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==v&&(M.hostname_original=v),a in h&&"1"==h[a])return g("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=v.indexOf(".")&&!/^[0-9.:]+$/.test(v)||L||g("Set hostname on "+v+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||x($,"referrer")||i.referrer||"").replace(v,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,K=function(e,t){if(0,!N||P||X()){var n=A(J,{type:"append",original_id:t?e:M.page_id});if(t||!h.sendBeacon)H(n,0,!0);else try{h.sendBeacon.bind(h)(_+"/append",u(n))}catch(r){H(n,0,!0)}}};l("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){g(ee)}return t},Y=function(e,t,n,r,a){e&&K(""+M.page_id,!0);var i=0===k?N:m;M.page_id=i||R();var o,c=z+Z.path,s=(o=t,(r||d.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||m),p=A(Z,{id:M.page_id,page_id:M.page_id,original_id:i,type:i?"append":"pageview",referrer:!t||n?G:null,query:s});return G=c,k++,p};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);q(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","preparePageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","pageviewData","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/app.js b/dist/v12/app.js index 04dfb96..814f1ca 100644 --- a/dist/v12/app.js +++ b/dist/v12/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; abdc; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; 033c; SRI-version; v12) */ -!function(h,t,e,n,m){try{var g=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,q="https://queue."+e,M=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[Mt];if(!ot(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},oe=function(e){return"function"==typeof e},ce="namespace",se=e[ce]||J(z,ce)||"sa",ue=function(e,t){var n=g[se+"_metadata"];Z(n)&&(e=K(e,n));var r=g[Me];if(!oe(r))return Me&&m(Me+" not found, set window."+Me),e;try{return K(e,r.call(g,K(e,t)))}catch(a){F("metadata",a)}},le=e.strictUtm||J(z,"strict-utm")==r,pe=function(i,e){te=!i&&re("q")?"":_;var t=(e||s.search).slice(1).split("&").filter(function(e){var t=e.indexOf("=");te!==_&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.js","sources":["app.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/app.js b/dist/v12/custom/app.js index d757299..cb87970 100644 --- a/dist/v12/custom/app.js +++ b/dist/v12/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 3222; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; 39f9; SRI-version; v12) */ -!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); +!function(g,t,e,n,m){try{var v=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=g.console,c="doNotTrack",b=g.navigator,s=g.location,O=s.host,l=g.document,p=b.userAgent,f="Not sending request ",d=f+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=g.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=g.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=g[st+"_metadata"];Z(n)&&(t=K(t,n));var r=g[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(g,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==_&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v12/custom/app.js.map b/dist/v12/custom/app.js.map index 39ae97e..82e6d42 100644 --- a/dist/v12/custom/app.js.map +++ b/dist/v12/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/light.js b/dist/v12/custom/light.js index 2d193ba..d9adaa9 100644 --- a/dist/v12/custom/light.js +++ b/dist/v12/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; d1f7; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; 401c; SRI-version; v12) */ -!function(l,e,t,f){try{var g=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,d=l.location,h=d.host,i=l.document,o=m.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,p=decodeURIComponent,u=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,x=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var $=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},I=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||A(E,V)||"sa",C=e.strictUtm||"true"==A(E,"strict-utm"),H=B+"_loaded";if(1==l[H])return f(c+"twice");l.sa_event_loaded=!0,l[H]=!0;var T,F=function(t,e,n){t=n?t:I(M,Z,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=g}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||A(E,"hostname"),z=L||h,J={version:"custom_light_12",hostname:z};e.mode||A(E,"mode");try{T=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}x&&(J.bot=!0);var M=I(J,{ua:o,https:d.protocol==n,timezone:T,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!0,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==h&&(M.hostname_original=h),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||L||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||A(E,"referrer")||i.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||g,K=function(e,t){if(0,!N||P||X()){var n=I(J,{type:"append",original_id:t?e:M.page_id});if(t||!m.sendBeacon)F(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",u(n))}catch(r){F(n,0,!0)}}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:g;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||g);F({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);$(t)&&-1"); +!function(f,e,t,g){try{var m=undefined,n="https:",r=f.console,a="doNotTrack",h=f.navigator,d=f.location,v=d.host,i=f.document,o=h.userAgent,c="Not sending request ",y=!1,s=encodeURIComponent,p=decodeURIComponent,u=JSON.stringify,l=f.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=h.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,x=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');g=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var $=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},I=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||A(E,V)||"sa",C=e.strictUtm||"true"==A(E,"strict-utm"),H=B+"_loaded";if(1==f[H])return g(c+"twice");f.sa_event_loaded=!0,f[H]=!0;var T,F=function(t,e,n){t=n?t:I(M,Z,t),h.brave&&!n&&(t.brave=!0),h._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||A(E,"hostname"),z=L||v,J={version:"custom_light_12",hostname:z};e.mode||A(E,"mode");try{T=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){g(ee)}x&&(J.bot=!0);var M=I(J,{ua:o,https:d.protocol==n,timezone:T,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!0,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==v&&(M.hostname_original=v),a in h&&"1"==h[a])return g("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=v.indexOf(".")&&!/^[0-9.:]+$/.test(v)||L||g("Set hostname on "+v+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||A(E,"referrer")||i.referrer||"").replace(v,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,K=function(e,t){if(0,!N||P||X()){var n=I(J,{type:"append",original_id:t?e:M.page_id});if(t||!h.sendBeacon)F(n,0,!0);else try{h.sendBeacon.bind(h)(_+"/append",u(n))}catch(r){F(n,0,!0)}}};l("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){g(ee)}return t},Y=function(e,t,n,r,a){e&&K(""+M.page_id,!0);var i=0===k?N:m;M.page_id=i||R();var o,c=z+Z.path,s=(o=t,(r||d.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||m),p=I(Z,{id:M.page_id,page_id:M.page_id,original_id:i,type:i?"append":"pageview",referrer:!t||n?G:null,query:s});return G=c,k++,p};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);$(t)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v12/custom/light.js.map b/dist/v12/custom/light.js.map index 7f3aa47..a010aa3 100644 --- a/dist/v12/custom/light.js.map +++ b/dist/v12/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","preparePageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","pageviewData","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAKAC,GAEA,IAQE,IAAIC,EAAeC,UAIfC,EAAQ,SAKRC,EAAMP,EAAOQ,QACbC,EAAa,aACbC,EAAMV,EAAOW,UACbC,EAAMZ,EAAOa,SACbC,EAAmBF,EAAIG,KACvBC,EAAMhB,EAAOiB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBAEbC,GAhBW,EAiBXC,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuB3B,EAAO4B,iBAC9BC,EAhBWvB,WAgB4BJ,EAEvC4B,GADkBd,EAAIe,gBACX,YAIXC,EAAStB,EAAIuB,cAMbC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAKrB,KAAe,WAAWqB,KAAKrB,GAIxDsB,EACFxB,EAAIyB,eAAiBzB,EAAI0B,cAAc,gBAAkBxC,EAAU,MAOrEC,EAAO,WAEL,IAAIwC,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAKtC,EAAIJ,KAAMI,EAAKoC,IAGtD,IAQIQ,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAOZC,EAAO,SAAUb,EAAec,GAClC,OAAOd,GAAiBA,EAAce,aAAa,QAAUD,IAe3DE,EAAS,WAGX,IAFA,IA7BsBC,EAAKC,EAwBJC,EAKnBC,EAAK,GACLC,EAAMf,UACDgB,EAAQ,EAAGA,EAAQD,EAAIE,OAAQD,IAAS,CAC/C,IAAIE,EAAaH,EAAIC,GACrB,IATqBH,EASRK,IAREL,EAAOM,cAAgBC,OASpC,IAAK,IAAIC,KAAWH,EAlCFP,EAmCJO,EAnCSN,EAmCGS,EAlCvBD,OAAOjB,UAAUmB,eAAevB,KAAKY,EAAKC,KAmCzCE,EAAGO,GAAWH,EAAWG,IAKjC,OAAOP,GAGLS,EAAWrE,EAAOsE,YAClBC,EAAcF,GAAYH,OAAOM,KAAKvE,GAAkB8D,OAG5D9D,EAAmBuD,EAAOvD,EAAkBoE,GAExCE,GAAapE,EAAK,WAAYF,GAGlC,IAAIwE,EACFxE,EAAiBwE,YAAcpB,EAAKb,EAAe,gBAE7B,iBAAfiC,GACN,yEAAyElC,KACxEkC,KAGFA,EAAarE,GASLsE,KAAKC,IALf,IAOIC,EAAO,WACT,IAAIC,EAAe7E,EAAO8E,QAAU9E,EAAO+E,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,OACEA,EACCN,EAAaO,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOC,GACP,OAAOP,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,IAAIK,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMP,EAAI,EAAIK,EAAS,EAAJA,EAAW,GACrBF,SAAS,QAKpBK,EAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,EAAgB,YAChBC,EACF7F,EAAiB4F,IACjBxC,EAAKb,EAAeqD,IA2axB,KAjaME,EACF9F,EAAiB8F,WAnLJ,QAoLb1C,EAAKb,EAAe,cAoClBwD,EAAiBF,EAAY,UACjC,GA3Nc,GA2NV9F,EAAOgG,GAA4B,OAAO7F,EAAKgB,EAAa,SAChEnB,EAAOiG,iBA5NO,EA6NdjG,EAAOgG,IA7NO,EAoOd,IA4DIE,EA5DAC,EAAW,SAAUC,EAAMC,EAAUC,GACvCF,EAAOE,EAAeF,EAAO5C,EAAO+C,EAASC,EAAMJ,GAE/C1F,EAAI+F,QAAUH,IAAcF,EAAKK,OAvOzB,GAwOR/F,EAAIgG,qBAAuBJ,IAAcF,EAAKO,MAxOtC,IA2OA,IAAIC,OACVC,IACJhF,EACA,eACAqC,OAAOM,KAAK4B,GACTU,OAAO,SAAUC,GAChB,OAAOX,EAAKW,IAAQ3G,IAErB4G,IAAI,SAAUD,GACb,OACE1F,EAAuB0F,GACvB,IACA1F,EAAuB+E,EAAKW,MAG/BE,KAAK,KACR,SACAvC,KAAKC,OAILuC,EACFjH,EAAiBkH,UAAY9D,EAAKb,EAAe,YAC/C4E,EAAkBF,GAAuBpG,EAEzCuG,EAAc,CAChBC,QA+UJ,kBA9UIH,SAAUC,GAeDnH,EAAiBsH,MAAQlE,EAAKb,EAAe,QAYxD,IAEE0D,EACIsB,KAAKC,iBAAiBC,kBAAkBC,SAE5C,MAAOpC,IACPpF,EAAKoF,IAQGjD,IAMD+E,EAAYO,KArTP,GAuTd,IAAIrB,EAAU/C,EAAO6D,EAAa,CAEhCQ,GAAkC3G,EAElCZ,MAAOM,EAAIkH,UAAYxH,EACvB4F,SAAUA,EACV6B,uBA7TY,EA8TZC,QAASvD,GAAoCG,IAG7CqD,WACIxD,GAAcG,MAyBpB,GArBA2B,EAAQ2B,KAtUM,EA0UVlG,IACFuE,EAAQ4B,OAASnG,EAAOmG,OACxB5B,EAAQ6B,OAAS3G,EAAUO,EAAOoG,SAWhChB,IAAoBtG,IACtByF,EAAQ8B,kBAAoBvH,GAG1BL,KAAcC,GAA0B,KAAnBA,EAAID,GAC3B,OAAON,EA5UYgB,4BA6UAV,EAAa,oBAAsB2B,EAAU,SAK7B,GAAlCtB,EAAiBwH,QAAQ,OACxB,aAAa/F,KAAKzB,IACnBoG,GAED/G,EACE,mBACEW,EACA,SACAsB,EACA,0BAON,IACImG,EADA/B,EAAO,GAiBPgC,GAXAvI,EAAiBuI,UAAYnF,EAAKb,EAAe,aAGzBxB,EAAIwH,UAAY,IACrCtD,QAAQpE,EAAkBsG,GAC1BlC,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS9E,EAcjCqI,EAAc,SAAUC,EAAIC,GAE9B,GADI,GACAlE,GAAe8D,GAAiBK,IAApC,CAEA,IAAIC,EAASrF,EAAO6D,EAAa,CAC/ByB,KAAM,SACNC,YAAaJ,EAAOD,EAAKnC,EAAQyB,UAKnC,GAAIW,IAASjI,EAAIsI,WAEf7C,EAAS0C,EAAQzI,GAzZP,QA2ZV,IACEM,EAAIsI,WAAWC,KAAKvI,EAApBA,CAAyBmB,EAAa,UAAWJ,EAAUoH,IAC3D,MAAOK,GAEP/C,EAAS0C,EAAQzI,GA/ZT,MAqaduB,EAnYe,WAmYgB8G,GApahB,GA2af,IAoDIU,EAAUC,EApDVR,EAAU,SAAUS,GACtB,IAAIC,EAAO,GAIX,IACEA,EAAOD,GAAa9H,EAAuBX,EAAI2I,UAC/C,MAAOhE,IACPpF,EAAKoF,IAMP,OAAO+D,GAMLE,EAAkB,SACpBC,EACAC,EACAP,EACAQ,EACAC,GAEIH,GAAahB,EAAY,GAAKlC,EAAQyB,SAvc9B,GAwcZ,IAAI6B,EAAuB,IAAVxH,EAAcoC,EAAarE,EAC5CmG,EAAQyB,QACN6B,GAAoCjF,IAEtC,IAnR6BkF,EAmRzBC,EAAc3C,EAAkBZ,EAAK8C,KACrCU,GApRyBF,EAoRFJ,GAAkBC,GAnRjB/I,EAAI+I,QAC7B/G,MAAM,GACNqH,MAAM,KACNnD,OAAO,SAAUoD,GAIhB,OAFaJ,GAaN,IAAIK,OART,YACCpE,EAAY,GAAK,KAClB,yCACCA,EAAY,GAAK,QAClB,KAIuB,KAAKxD,KAAK2H,KAEpCjD,KAAK,MAEI7G,GA+PRgG,EAAO5C,EAAOgD,EAAM,CACtBkC,GAAInC,EAAQyB,QACZA,QAASzB,EAAQyB,QACjBe,YAAac,EACbf,KAAMe,EAAa,SA/cJ,WAgdfrB,UAAWkB,GAAoBP,EAAWX,EAAW,KACrDwB,MAAOA,IAQT,OAHAxB,EAAWuB,EAEX1H,IACO+D,IAKM,SACbqD,EACAW,EACAR,EACAS,IAEKA,GAAe1E,EAAWiE,KAAWS,EAAcT,GACxD,IACIU,EAGEC,EAJS5E,EAAW0E,GAEtBlH,EAASiH,KAAgD,EAA9BA,EAAc9B,QAAQ,OAGnD8B,GADIG,EAAQH,EAAcH,MAAM,MACVO,QACtBF,EAAc,IAAMC,EAAMtD,KAAK,MAGjC,IAAIqC,EAAOV,EAAQwB,GAUnB,GARKd,GAASf,IAAgB9D,IAE5B8B,EAAQyB,QAA+BpD,IACnC2B,EAAQ0B,aAAexD,IAAY8B,EAAQ0B,WAAarD,KAC5DH,EAAarE,GAIVkJ,GAAQf,GAAgBe,EAA7B,CAEAf,EAAee,EACf9C,EAAK8C,KAAOA,EAKN5I,EAAIoB,KAAW0E,EAAK1E,GAAYpB,EAAIoB,IAK1C,IAII2I,EAJAC,EAAO1K,EAAO2K,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG9B,KAC/D,MAAOvD,IACPpF,EAAKoF,IAGP6D,EAAgBqB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBnC,QAAQmC,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGtC,QAAQoC,EAAKE,GAAgB9B,MAGxCK,IAAWX,GACPA,EAASyB,MAxhBH,KAwhBgB,IAAMnJ,EAKhC,IACIgK,EAAetB,EACjBC,EAFWA,GAAeL,IAAiB,EAI3CD,EACAmB,GAIES,EAAsB,WACxB3J,GA7iBU,EA8iBV+E,EAAS2E,IAGX,GAAK1J,EAmBH2J,SAjBA,IACM/I,GAAU2D,EAAW3D,EAAOgJ,sBAC9BhJ,EACGgJ,qBAAqB,CAAC9I,EAAcC,IACpC8I,KAAK,SAAUC,GACd3E,EAAQ4E,QAAUD,EAAkBhJ,GACpCqE,EAAQ6E,WAAaF,EAAkB/I,GACvC4I,MAEDM,SAAMN,GAETA,IAEF,MAAO7B,GACP6B,MASNO,GAEA,MAAOpC,IACP/I,EAAK+I,KAhmBT,CAmmBElJ,OACA,uBACA"} \ No newline at end of file diff --git a/dist/v12/custom/proxy.js b/dist/v12/custom/proxy.js index 3a76816..07b8f25 100644 --- a/dist/v12/custom/proxy.js +++ b/dist/v12/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; 0382; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; 4e68; SRI-version; v12) */ -!function(h,t,e,n,g){try{var m=undefined,v=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=h.console,c="doNotTrack",w=h.navigator,s=h.location,b=s.host,l=h.document,p=w.userAgent,f="Not sending request ",d=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=h.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",I="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=h.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');g=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){g("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=h[st+"_metadata"];Z(n)&&(t=K(t,n));var r=h[qt];if(!ot(r))return qt&&g(qt+" not found, set window."+qt),t;try{return K(t,r.call(h,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==y&&0"); +!function(g,t,e,n,m){try{var v=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=g.console,c="doNotTrack",b=g.navigator,s=g.location,x=s.host,l=g.document,p=b.userAgent,f="Not sending request ",d=f+"when ",O=_,h=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=g.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",I="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=g.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=g[st+"_metadata"];Z(n)&&(t=K(t,n));var r=g[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(g,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==_&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v12/custom/proxy.js.map b/dist/v12/custom/proxy.js.map index 1d90510..1090e9f 100644 --- a/dist/v12/custom/proxy.js.map +++ b/dist/v12/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","originalId","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAhBW3B,WAgB4BR,EACvCoC,EAAkBf,EAAIe,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAASzB,EAAI0B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK5B,KAAe,WAAW4B,KAAK5B,GACxD6B,EAAStD,EAAOsD,OAIhBC,EACFhC,EAAIiC,eAAiBjC,EAAIkC,cAAc,gBAAkBvD,EAAU,MAOrEE,EAAO,WAEL,IAAIsD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK9C,EAAIV,KAAMU,EAAK4C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnChE,EAAK,iBAAmB+D,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWjG,EAAOkG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKnG,GAAkBqF,OAG5DrF,EAAmB0F,EAAO1F,EAAkBgG,GAExCE,GAAa/F,EAAK,WAAYH,GAGlC,IAAIoG,GACFpG,EAAiBoG,YAActB,EAAKxB,EAAe,gBAE7B,iBAAf8C,IACN,yEAAyEhD,KACxEgD,MAGFA,GAAahG,GAIf,IA+EIiG,GA/EAC,GAAgBrB,EAClBjF,EAAiBsG,eAAiBxB,EAAKxB,EAAe,mBAGpDiD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU7B,GAC7B,OAAO,IAAI8B,OAAO,IAAMF,GAAoBpD,KAAKwB,KAChDS,QAIHsB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe/G,EAAOgH,QAAUhH,EAAOiH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOnD,GACP,OAAO8C,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF7H,EAAiB4H,KACjB9C,EAAKxB,EAAesE,KAmzBxB,KAhzBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBlI,EAAO8H,GAAY,aACpCtC,EAAS0C,KAAiBF,EAAWrC,EAAOqC,EAAUE,IAC1D,IAAIC,EAA4BnI,EAAOoI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACFhI,EACEgI,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOrC,EACLqC,EACAG,EAA0BvE,KAAK5D,EAAQ2F,EAAOqC,EAAUC,KAE1D,MAAO7D,GACPF,EAAe,WAAYE,KAU3BiE,GACFpI,EAAiBoI,WACjBtD,EAAKxB,EAAe,eAAiB9C,EAInC6H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAKhG,EACvD,IAAIiI,GAAKD,GAAmBrH,EAAIuH,QAC7B/E,MAAM,GACN4B,MAAM,KACNmB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM9F,GAAgB,EAAJoI,GAASD,EAAShF,MAAMiF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAShF,MAAM,EAAGiF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIrE,GAAasE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAY1D,OAAe9E,EAInC,IAAImG,OAAOwC,EAAO,KAAK9F,KAAKsF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKjG,EACFoI,GAAKpI,GA+BV+I,GAAiBtB,GAAY,UACjC,GAAI9H,EAAOoJ,KAAmB7I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOqJ,gBAAkB9I,EACzBP,EAAOoJ,IAAkB7I,EAOzB,IAAI+I,GAAW,SAAUrB,EAAMsB,EAAUC,GACvCvB,EAAOuB,EAAevB,EAAOtC,EAAO8D,GAASC,GAAMzB,GAE/ChH,EAAI0I,QAAUH,IAAcvB,EAAK0B,MAAQpJ,GACzCU,EAAI2I,qBAAuBJ,IAAcvB,EAAK4B,KAAOtJ,GAGzD,IAAIuJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJ7H,EACA,eACAmC,OAAO4B,KAAK6B,GACTvB,OAAO,SAAUyD,GAChB,OAAOlC,EAAKkC,IAAQ9J,IAErB4I,IAAI,SAAUkB,GACb,OACEtI,EAAuBsI,GACvB,IACAtI,EAAuBoG,EAAKkC,MAG/BjB,KAAK,KACR,SACArC,KAAKD,OAILwD,GACFnK,EAAiBoK,UAAYtF,EAAKxB,EAAe,YAC/C+G,GAAkBF,IAAuB/I,EAEzCkJ,GAAc,CAChBC,QAiqBJ,kBAhqBIH,SAAUC,IASZnK,EAAY,SAAUsK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJrK,EAAKqK,GACLnB,GACE3D,EAAO4E,GAAa,CAClBI,KAAM9J,EACNuD,MAAOqG,EACPG,KAAMzJ,EAAI0J,WAEZxK,EACAE,IAMJ4B,EACEtB,EACA,SAAUiK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASlC,QAAQ3I,IAC3CC,EAAU2K,EAAME,UAGpBxK,GAOF,IAwDIyK,GAxDAC,GAAQtE,KAERuE,GAAW,EAOXC,GAAOnL,EAAiBmL,MAAQrG,EAAKxB,EAAe,QAGpD8H,MA/KsBC,GA+KCrL,EAAiBoL,cA9KvBC,GA+KjBrL,EAAiBoL,WACjBtG,EAAKxB,EAAe,eAAiB9C,GACrCsE,EAAKxB,EAAe,aAAe9C,GACnCsE,EAAKxB,EAAe,gBAAkB9C,EAGtC8K,KACqC,SAAvCxG,EAAKxB,EAAe,iBACpBtD,EAAiBsL,cAAgB/K,GAI/BgL,GACFvL,EAAiBwL,UACjB1G,EAAKxB,EAAe,cACpBuE,GAAY,IAAMlH,EAGhB8K,GAAcxG,EAChBjF,EAAiByL,aAAe3G,EAAKxB,EAAe,iBAIlDyF,GAAc9D,EAChBjF,EAAiB+I,aAAejE,EAAKxB,EAAe,iBAIlDoI,GAAqBzG,EACvBjF,EAAiB0L,oBACf5G,EAAKxB,EAAe,yBAIpBqI,GACF3L,EAAiB2L,gBAAkB7G,EAAKxB,EAAe,mBAGrD6E,GACFnI,EAAiBmI,mBACjBrD,EAAKxB,EAAe,sBAItB,IAEE0H,GAAWzE,GAAsB,KAC7BqF,KAAKC,iBAAiBC,kBAAkBC,SACxC3L,EACJ,MAAO+D,IACPhE,EAAKgE,IAOP,IAAI6H,GAAUjM,EAAOiM,QACjBC,GACFjL,EAAIkL,WACJnM,EAAOoM,aACPpM,EAAOqM,aACPrM,EAAOsM,UACNL,KAAYA,GAAQM,QACrBvM,EAAOwM,YACPxM,EAAOyM,MACPrJ,GACAqE,KAAKC,UAAYD,KAAKC,SAGpBgF,GACFlG,GAAsB,MAAQA,GAAsB,QAElD0F,KAAK3B,GAAY2B,IAAM3L,GAE3B,IAAIkJ,GAAU9D,EAAO4E,GAAa,CAEhCoC,GAAInG,GAAsB,MAAQ/E,EAAYpB,EAE9CK,MAAOS,EAAIyL,UAAYlM,EACvBuK,SAAUA,GACV4B,sBAAuBtM,EACvBuM,QAASzG,KAAeqG,GAAqB5F,KAASzG,GAGtD0M,WAAYvG,GAAsB,MAC9BH,IAAcS,KACdzG,IA0BN,GAvBAoJ,GAAQuD,IAAMzM,EAIVmC,IACF+G,GAAQwD,OAASvK,EAAOuK,OACxBxD,GAAQyD,OAASjL,EAAUS,EAAOwK,SAS/B3L,EAAI4L,SAAS/M,EAAK,4CAInBkK,KAAoBjJ,IACtBoI,GAAQ2D,kBAAoB/L,IAGzBgK,IAAcrK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBkC,EAAU,SAK7B,GAAlC7B,EAAiBwH,QAAQ,OACxB,aAAaxF,KAAKhC,IACnB+I,IAEDhK,EACE,mBACEiB,EACA,SACA6B,EACA,0BAON,IACImK,GA2DAC,GA5DA5D,GAAO,GAGP6D,GAAc,WAKhB,OAFEtN,EAAiBuN,UAAYzI,EAAKxB,EAAe,aAGzBhC,EAAIiM,UAAY,IACrC1I,QAAQzD,EAAkBiJ,IAC1BxF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAASzE,GAKjCmN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKlB,MACDrG,IAAegH,IAAiBQ,MAApC,CAEA,IAAIC,EAASnI,EAAO4E,GAAa,CAC/BI,KAAM,SACNoD,YAAaH,EAAOD,EAAKlE,GAAQqD,UAenC,GAXItG,GAAsB,OACxBsH,EAAOE,SAAWvG,KAAKwG,OAAOrH,KAAQsE,GAAQuC,IAnhBnC,MAqhBbA,GAAW,EACXvC,GAAQtE,KAGJJ,GAAsB,UACxBsH,EAAO3C,SAAW1D,KAAKyG,IAAI,EAAG/C,GAAUgD,OAGtCP,IAAS3M,EAAImN,WAEf9E,GAASwE,EAAQzN,EAAcE,QAE/B,IACEU,EAAImN,WAAWC,KAAKpN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU6L,IAC3D,MAAOQ,GAEPhF,GAASwE,EAAQzN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAIgN,QACA,KAAOxL,KAAY/C,GAAS0N,KAClCJ,GAAc1G,MACT6G,IAAY7G,KAAQ0G,IAE7B9M,GAGF2B,EAAqBY,EAAU2K,GAAalN,GAE5C,IAAIgO,GAAOjN,EAAIiN,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuBnM,EAAgBQ,IAAiB,EACxD4L,EAASjH,KAAKyG,IAChBM,GAAK5L,IAAiB,EACtB4L,GAAK3L,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO4E,KAAKkH,IACV,IAKI,EAJJlH,KAAKwG,MACF,MAAQ3L,EAAgBsM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOtK,IAEP,OADAhE,EAAKgE,IACE,IAIXjC,EAAqB,OAAQ,WAC3BgJ,GAAWgD,KACXhM,EACEM,EACA,WACM0I,GAAWgD,OAAYhD,GAAWgD,OAExC3N,KAQJ,IAgCIqO,GAqCAC,GAAUC,GArEVlB,GAAU,SAAUmB,GACtB,IAAIpE,EAAO,GAIX,IACEA,EAAOoE,GAAajN,EAAuBZ,EAAI0J,UAC/C,MAAOzG,IACPhE,EAAKgE,IAGP,IAAI6K,EAAyBjP,EAAO4L,IACpC,GAAIjE,GAAWsH,GACb,IACErE,EAAOqE,EAAuBrL,KAAK5D,EAAQ,CAAE4K,KAAMA,KAAWA,EAC9D,MAAOxG,IACPF,EAAe,OAAQE,IAK3B,IAhZiB,SAAUwG,GAC3B,IAAK,IAAIhC,KAAK8C,GAAa,CACzB,IAAIwD,EAAgBxD,GAAY9C,GAChC,GAAKsG,EAAL,CAGA,IAAIC,EA1PI,KA2PND,EAAc,GAAcA,EA3PtB,IA2P8CA,EAEtD,GACEC,IAAevE,GACf,IAAIjE,OACF,IAAM/B,EAAYuK,GAAYrK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKuH,GAEP,OAAOrK,GAEX,OAAOC,EA8XH4O,CAAaxE,GAQjB,MAFY,QAARQ,IAAkBjK,EAAIkO,OAAMzE,GAAQzJ,EAAIkO,KAAK9J,MAAM,KAAK,IAErDqF,EAPLxK,EAAKuB,EAAiB,YAAciJ,IAiDpC0E,GAAW,SACbC,EACAC,EACAxH,EACAyH,IAEKA,GAAe9H,GAAWK,KAAWyH,EAAczH,GACxD,IACI0H,EAGEC,EAJFpG,EAAW5B,GAAW8H,GAAeA,EAAc,aAEnD/K,EAAS8K,KAAgD,EAA9BA,EAAc3G,QAAQ,OAGnD2G,GADIG,EAAQH,EAAcjK,MAAM,MACVqK,QACtBF,EAAc,IAAMC,EAAMzG,KAAK,MAGjC,IAAI0B,EAAOiD,GAAQ2B,GAUnB,GARK5E,GAASyC,KAAgBhH,KAE5BoD,GAAQqD,QAAUJ,GAAqB5F,KAASzG,EAC5CoJ,GAAQsD,aAAe1G,KAAYoD,GAAQsD,WAAajG,MAC5DT,GAAahG,GAIVuK,GAAQyC,IAAgBzC,EAA7B,CAEAyC,GAAezC,EACflB,GAAKkB,KAAOA,EAGRpE,GAAsB,OACxBkD,GAAKmG,eACHpI,KAAKyG,IAAI5L,EAA2B,aAAK,EAAGtC,EAAO8P,YAAc,IACjE,KACFpG,GAAKqG,gBACHtI,KAAKyG,IACH5L,EAAgBQ,IAAiB,EACjC9C,EAAOgQ,aAAe,IACnB,MAILxJ,GAAsB,MACpBvF,EAAIsB,KAAWmH,GAAKnH,GAAYtB,EAAIsB,IAItCe,GAAUkD,GAAsB,QAClCkD,GAAKuG,aAAe3M,EAAO4M,MAC3BxG,GAAKyG,cAAgB7M,EAAOoL,QAI9B,IAII0B,EAJAC,EAAOrQ,EAAOsQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG5F,KAC/D,MAAOvG,IACPhE,EAAKgE,IAGP2K,GAAgBqB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBvH,QAAQuH,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAG1H,QAAQwH,EAAKE,GAAgB5F,MAGxC,IAAI8F,EAA0BjD,GAC1BA,GAASjI,MAlwBH,KAkwBgB,GACtBlF,EACJyO,GAAWtB,IACgD,EAAvD7B,GAAmB9C,QAAQ4H,IAC3BA,GAA2BpP,EAC3Bb,EAGJkJ,GAAKgH,OACH,QAAQrN,KAAKkK,OAAkBgC,GAAeR,GAC1CvO,GACCsO,GAEP9G,EAAWD,GAAeC,EAAU,CAClC2C,KAAMhK,EACNiK,KAAMlB,GAAKkB,OAGb,IACI+F,EAnIgB,SACpBpB,EACAqB,EACA9B,EACApG,EACAV,GAEIuH,GAAa7B,GAAY,GAAKjE,GAAQqD,QAASvM,GACnD,IAAIsQ,EAAuB,IAAV1N,EAAckD,GAAahG,EAC5CoJ,GAAQqD,QACN+D,IAAenE,GAAqB5F,KAASzG,GAE/C,IAAIyQ,EAAcxG,GAAkBZ,GAAKkB,KACrCmG,EAAQzI,GAAesI,EAAkBlI,GAEzCT,EAAOtC,EAAO+D,GAAM,CACtBiE,GAAIlE,GAAQqD,QACZA,QAASrD,GAAQqD,QACjBiB,YAAa8C,EACblG,KAAMkG,EAAa,SAAWlQ,EAC9B6M,UAAWoD,GAAoB9B,EAAWtB,GAAW,KACrDuD,MAAOA,EACPzK,EAAGA,GAEH0B,SAAU/F,EAAU+F,KAOtB,OAJA6G,GAAmBrB,GACnBA,GAAWsD,EAEX3N,IACO8E,EAoGY+I,CACjBzB,EAFWA,GAAeR,KAAkBvI,GAAsB,KAIlEsI,GACAY,EACA1H,GAGEiJ,EAAsB,WACxBrP,EAA2BrB,EAC3B+I,GAASqH,EAAcpH,IAGzB,GAAK3H,EAmBHqP,SAjBA,IACMvO,GAAUiF,GAAWjF,EAAOwO,sBAC9BxO,EACGwO,qBAAqB,CAAClO,EAAcC,IACpCkO,KAAK,SAAUC,GACd3H,GAAQ4H,QAAUD,EAAkBpO,GACpCyG,GAAQ6H,WAAaF,EAAkBnO,GACvCgO,MAEDM,SAAMN,GAETA,IAEF,MAAO3C,GACP2C,OAWFO,GAAMxR,EAAOyR,QACbC,GAAeF,GAAMA,GAAIG,UAAYtR,EACrCuR,GAAM5R,EAAO6R,cACbC,GAAgB,YAIhBvG,IAAemG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB7G,GAoBAmH,IAlBrB,WACL,IAEIhH,EAFAjF,EAAMhC,UACNoO,EAAKD,GAAK/N,MAAMiO,KAAMrM,GAY1B,OAVI8B,GAAWoK,OACbjH,EAAQ,IAAIiH,MAAMpH,KAIlBG,EAAQvJ,EAAI4Q,YAAY,UAClBC,UAAUzH,GAAMpK,EAASA,GAEjCuK,EAAMjH,UAAYgC,EAClB+L,GAAI9G,GACGmH,IAMX9P,EACE2P,GACA,WACExC,GAAS,IAEX9O,GAGF2B,EACE,WACA,WACEmN,GAAS,IAEX9O,IAKA+K,IAAuB,QAARH,IAAkB,iBAAkBpL,GACrDmC,EACE,aACA,WACEmN,GAAS,IAEX9O,GAIA+K,IAAa+D,KAEjBtP,EAAOqS,YAAc,SAAUzH,EAAM5C,EAAUuB,GAC7C+F,GAAS,EAAG1E,EAAM5C,EAAUuB,IAQ9B,IAAI+I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUzH,EAAO9C,EAAUyH,IACpCA,GAAe9H,GAAWK,KAAWyH,EAAczH,GAExD,IAAIwK,EAAkB7K,GAAWmD,GAC7BvB,EAAW5B,GAAW8H,GAAeA,EAAc,aACnDgD,SAAmB3H,EAEvB,GAAIwH,GAAWzJ,QAAQ4J,GAAa,IAAMD,EAExC,OADAtO,EAAesH,GAAmB5K,EAAY,aAAe6R,GACtDlJ,IAGT,IACE,GAAIiJ,EAAiB,CACnB,IAAIE,EAAc5H,IAClB,GAAIwH,GAAWzJ,eAAe6J,GAAe,EAK3C,OAJAxO,EACEsH,GACAV,EAAQ,uBAAyB4H,GAE5BnJ,IAETuB,EAAQ4H,GAEV,MAAOtO,IAEP,OADAF,EAAesH,GAAmBpH,IAC3BmF,IAGTuB,GAAS,GAAKA,GAAOhG,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAI6N,EAAc,CAAEhI,KAAM/J,EAAWkK,MAAOA,GACxC8H,GAAa7D,IAAiB5L,EAAQ,GAGtCkD,IAAegH,IAAiBQ,OAClC8E,EAAY7F,QAAUzM,EACtBsS,EAAY5F,WAAa1M,GAG3B2H,EAAWD,GAAeC,EAAU2K,GAEhC7H,GACFxB,GACE3D,EAAOgN,EAAa,CAClBhF,GAAI7G,KACJiK,MAAOzI,IAAgBsK,GACvBpF,UACGoF,GAAa9D,KAAatI,GAAsB,KAC7CqI,GACA,KAEN7G,SAAU/F,EAAU+F,KAEtBuB,IAKFsJ,GAAmB,SAAU/H,EAAO9C,EAAUuB,GAChDgJ,GAAUzH,EAAO9C,EAAUuB,IAIxBvJ,EAAOwL,MACVxL,EAAOwL,IAAqBqH,IAE9B,IAAIC,GAAY9S,EAAOwL,IAGnBuH,GAAQD,IAAaA,GAAUrK,EAAIqK,GAAUrK,EAAI,GAMrD,IAAK,IAAIqC,MAHT9K,EAAOwL,IAAqBqH,GAGVE,GACZ1O,EAAQ0O,GAAOjI,MACjB1F,MAAMC,QAAQ0N,GAAMjI,KAChByH,GAAUtO,MAAM,KAAM8O,GAAMjI,KAC5ByH,GAAUQ,GAAMjI,MAGxB,MAAOwD,IACPnO,EAAUmO,IAnJY,IAAU3D,GACxBqH,GAjoBkB1G,GA/N9B,CAq/BEtL,OACA,uBACA"} \ No newline at end of file diff --git a/dist/v12/light.js b/dist/v12/light.js index a4c3862..74bda75 100644 --- a/dist/v12/light.js +++ b/dist/v12/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; e149; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; a39c; SRI-version; v12) */ -!function(l,e,t,f){try{var m=undefined,n="https:",r=l.console,a="doNotTrack",g=l.navigator,d=l.location,h=d.host,i=l.document,o=g.userAgent,c="Not sending request ",v=!1,s=encodeURIComponent,p=decodeURIComponent,u=JSON.stringify,y=l.addEventListener,_="https://queue."+t,b=(i.documentElement,"language"),w=g.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,E=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),$=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||x($,V)||"sa",C=e.strictUtm||"true"==x($,"strict-utm"),T=B+"_loaded";if(1==l[T])return f(c+"twice");l.sa_event_loaded=!0,l[T]=!0;var F,H=function(t,e,n){t=n?t:A(M,Z,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||x($,"hostname"),z=L||h,J={version:"cdn_light_12",hostname:z};e.mode||x($,"mode");try{F=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){f(ee)}E&&(J.bot=!0);var M=A(J,{ua:o,https:d.protocol==n,timezone:F,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!0,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==h&&(M.hostname_original=h),a in g&&"1"==g[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||L||f("Set hostname on "+h+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||x($,"referrer")||i.referrer||"").replace(h,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,K=function(e,t){if(0,!N||P||X()){var n=A(J,{type:"append",original_id:t?e:M.page_id});if(t||!g.sendBeacon)H(n,0,!0);else try{g.sendBeacon.bind(g)(_+"/append",u(n))}catch(r){H(n,0,!0)}}};y("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){f(ee)}return t},Y=function(e,t,n,r,a,i){e&&K(""+M.page_id,!0);var o=0===k?N:m;M.page_id=o||R();var c,s=z+X(),p=(c=t,(r||d.search).slice(1).split("&").filter(function(e){return!c&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||m);H({id:M.page_id,original_id:o,type:o?"append":"pageview",referrer:!t||n?G:null,query:p}),G=s,k++};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);q(t)&&-1>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||x($,V)||"sa",C=e.strictUtm||"true"==x($,"strict-utm"),T=B+"_loaded";if(1==f[T])return g(c+"twice");f.sa_event_loaded=!0,f[T]=!0;var F,H=function(t,e,n){t=n?t:A(M,Z,t),h.brave&&!n&&(t.brave=!0),h._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||x($,"hostname"),z=L||v,J={version:"cdn_light_12",hostname:z};e.mode||x($,"mode");try{F=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){g(ee)}E&&(J.bot=!0);var M=A(J,{ua:o,https:d.protocol==n,timezone:F,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!0,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==v&&(M.hostname_original=v),a in h&&"1"==h[a])return g("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=v.indexOf(".")&&!/^[0-9.:]+$/.test(v)||L||g("Set hostname on "+v+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||x($,"referrer")||i.referrer||"").replace(v,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,K=function(e,t){if(0,!N||P||X()){var n=A(J,{type:"append",original_id:t?e:M.page_id});if(t||!h.sendBeacon)H(n,0,!0);else try{h.sendBeacon.bind(h)(_+"/append",u(n))}catch(r){H(n,0,!0)}}};l("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){g(ee)}return t},Y=function(e,t,n,r,a){e&&K(""+M.page_id,!0);var i=0===k?N:m;M.page_id=i||R();var o,c=z+Z.path,s=(o=t,(r||d.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||m),p=A(Z,{id:M.page_id,page_id:M.page_id,original_id:i,type:i?"append":"pageview",referrer:!t||n?G:null,query:s});return G=c,k++,p};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);q(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","preparePageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","pageviewData","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAKAC,GAEA,IAQE,IAAIC,EAAeC,UAIfC,EAAQ,SAKRC,EAAMP,EAAOQ,QACbC,EAAa,aACbC,EAAMV,EAAOW,UACbC,EAAMZ,EAAOa,SACbC,EAAmBF,EAAIG,KACvBC,EAAMhB,EAAOiB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBAEbC,GAhBW,EAiBXC,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuB3B,EAAO4B,iBAC9BC,EAAaC,iBAA0B5B,EAEvC6B,GADkBf,EAAIgB,gBACX,YAIXC,EAASvB,EAAIwB,cAMbC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAKtB,KAAe,WAAWsB,KAAKtB,GAIxDuB,EACFzB,EAAI0B,eAAiB1B,EAAI2B,cAAc,gBAAkBzC,EAAU,MAOrEC,EAAO,WAEL,IAAIyC,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAKvC,EAAIJ,KAAMI,EAAKqC,IAGtD,IAQIQ,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAOZC,EAAO,SAAUb,EAAec,GAClC,OAAOd,GAAiBA,EAAce,aAAa,QAAUD,IAe3DE,EAAS,WAGX,IAFA,IA7BsBC,EAAKC,EAwBJC,EAKnBC,EAAK,GACLC,EAAMf,UACDgB,EAAQ,EAAGA,EAAQD,EAAIE,OAAQD,IAAS,CAC/C,IAAIE,EAAaH,EAAIC,GACrB,IATqBH,EASRK,IAREL,EAAOM,cAAgBC,OASpC,IAAK,IAAIC,KAAWH,EAlCFP,EAmCJO,EAnCSN,EAmCGS,EAlCvBD,OAAOjB,UAAUmB,eAAevB,KAAKY,EAAKC,KAmCzCE,EAAGO,GAAWH,EAAWG,IAKjC,OAAOP,GAGLS,EAAWtE,EAAOuE,YAClBC,EAAcF,GAAYH,OAAOM,KAAKxE,GAAkB+D,OAG5D/D,EAAmBwD,EAAOxD,EAAkBqE,GAExCE,GAAarE,EAAK,WAAYF,GAGlC,IAAIyE,EACFzE,EAAiByE,YAAcpB,EAAKb,EAAe,gBAE7B,iBAAfiC,GACN,yEAAyElC,KACxEkC,KAGFA,EAAatE,GASLuE,KAAKC,IALf,IAOIC,EAAO,WACT,IAAIC,EAAe9E,EAAO+E,QAAU/E,EAAOgF,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,OACEA,EACCN,EAAaO,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOC,GACP,OAAOP,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,IAAIK,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMP,EAAI,EAAIK,EAAS,EAAJA,EAAW,GACrBF,SAAS,QAKpBK,EAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,EAAgB,YAChBC,EACF9F,EAAiB6F,IACjBxC,EAAKb,EAAeqD,IA2axB,KAjaME,EACF/F,EAAiB+F,WAnLJ,QAoLb1C,EAAKb,EAAe,cAoClBwD,EAAiBF,EAAY,UACjC,GA3Nc,GA2NV/F,EAAOiG,GAA4B,OAAO9F,EAAKgB,EAAa,SAChEnB,EAAOkG,iBA5NO,EA6NdlG,EAAOiG,IA7NO,EAoOd,IA4DIE,EA5DAC,EAAW,SAAUC,EAAMC,EAAUC,GACvCF,EAAOE,EAAeF,EAAO5C,EAAO+C,EAASC,EAAMJ,GAE/C3F,EAAIgG,QAAUH,IAAcF,EAAKK,OAvOzB,GAwORhG,EAAIiG,qBAAuBJ,IAAcF,EAAKO,MAxOtC,IA2OA,IAAIC,OACVC,IACJjF,EACA,eACAsC,OAAOM,KAAK4B,GACTU,OAAO,SAAUC,GAChB,OAAOX,EAAKW,IAAQ5G,IAErB6G,IAAI,SAAUD,GACb,OACE3F,EAAuB2F,GACvB,IACA3F,EAAuBgF,EAAKW,MAG/BE,KAAK,KACR,SACAvC,KAAKC,OAILuC,EACFlH,EAAiBmH,UAAY9D,EAAKb,EAAe,YAC/C4E,EAAkBF,GAAuBrG,EAEzCwG,EAAc,CAChBC,QA+UJ,eA9UIH,SAAUC,GAeDpH,EAAiBuH,MAAQlE,EAAKb,EAAe,QAYxD,IAEE0D,EACIsB,KAAKC,iBAAiBC,kBAAkBC,SAE5C,MAAOpC,IACPrF,EAAKqF,IAQGjD,IAMD+E,EAAYO,KArTP,GAuTd,IAAIrB,EAAU/C,EAAO6D,EAAa,CAEhCQ,GAAkC5G,EAElCZ,MAAOM,EAAIkB,UAAYxB,EACvB6F,SAAUA,EACV4B,uBA7TY,EA8TZC,QAAStD,GAAoCG,IAG7CoD,WACIvD,GAAcG,MAyBpB,GArBA2B,EAAQ0B,KAtUM,EA0UVjG,IACFuE,EAAQ2B,OAASlG,EAAOkG,OACxB3B,EAAQ4B,OAAS3G,EAAUQ,EAAOmG,SAWhCf,IAAoBvG,IACtB0F,EAAQ6B,kBAAoBvH,GAG1BL,KAAcC,GAA0B,KAAnBA,EAAID,GAC3B,OAAON,EA5UYgB,4BA6UAV,EAAa,oBAAsB4B,EAAU,SAK7B,GAAlCvB,EAAiBwH,QAAQ,OACxB,aAAa9F,KAAK1B,IACnBqG,GAEDhH,EACE,mBACEW,EACA,SACAuB,EACA,0BAON,IACIkG,EADA9B,EAAO,GAiBP+B,GAXAvI,EAAiBuI,UAAYlF,EAAKb,EAAe,aAGzBzB,EAAIwH,UAAY,IACrCrD,QAAQrE,EAAkBuG,GAC1BlC,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS/E,EAcjCqI,EAAc,SAAUC,EAAIC,GAE9B,GADI,GACAjE,GAAe6D,GAAiBK,IAApC,CAEA,IAAIC,EAASpF,EAAO6D,EAAa,CAC/BwB,KAAM,SACNC,YAAaJ,EAAOD,EAAKlC,EAAQwB,UAKnC,GAAIW,IAASjI,EAAIsI,WAEf5C,EAASyC,EAAQzI,GAzZP,QA2ZV,IACEM,EAAIsI,WAAWC,KAAKvI,EAApBA,CAAyBmB,EAAa,UAAWJ,EAAUoH,IAC3D,MAAOK,GAEP9C,EAASyC,EAAQzI,GA/ZT,MAqaduB,EAnYe,WAmYgB8G,GApahB,GA2af,IAoDIU,EAAUC,EApDVR,EAAU,SAAUS,GACtB,IAAIC,EAAO,GAIX,IACEA,EAAOD,GAAa9H,EAAuBX,EAAI2I,UAC/C,MAAO/D,IACPrF,EAAKqF,IAMP,OAAO8D,GAMLE,EAAkB,SACpBC,EACAC,EACAP,EACAQ,EACAC,GAEIH,GAAahB,EAAY,GAAKjC,EAAQwB,SAvc9B,GAwcZ,IAAI6B,EAAuB,IAAVvH,EAAcoC,EAAatE,EAC5CoG,EAAQwB,QACN6B,GAAoChF,IAEtC,IAnR6BiF,EAmRzBC,EAAc1C,EAAkBZ,EAAK6C,KACrCU,GApRyBF,EAoRFJ,GAAkBC,GAnRjB/I,EAAI+I,QAC7B9G,MAAM,GACNoH,MAAM,KACNlD,OAAO,SAAUmD,GAIhB,OAFaJ,GAaN,IAAIK,OART,YACCnE,EAAY,GAAK,KAClB,yCACCA,EAAY,GAAK,QAClB,KAIuB,KAAKxD,KAAK0H,KAEpChD,KAAK,MAEI9G,GA+PRiG,EAAO5C,EAAOgD,EAAM,CACtBiC,GAAIlC,EAAQwB,QACZA,QAASxB,EAAQwB,QACjBe,YAAac,EACbf,KAAMe,EAAa,SA/cJ,WAgdfrB,UAAWkB,GAAoBP,EAAWX,EAAW,KACrDwB,MAAOA,IAQT,OAHAxB,EAAWuB,EAEXzH,IACO+D,IAKM,SACboD,EACAW,EACAR,EACAS,IAEKA,GAAezE,EAAWgE,KAAWS,EAAcT,GACxD,IACIU,EAGEC,EAJS3E,EAAWyE,GAEtBjH,EAASgH,KAAgD,EAA9BA,EAAc9B,QAAQ,OAGnD8B,GADIG,EAAQH,EAAcH,MAAM,MACVO,QACtBF,EAAc,IAAMC,EAAMrD,KAAK,MAGjC,IAAIoC,EAAOV,EAAQwB,GAUnB,GARKd,GAASf,IAAgB7D,IAE5B8B,EAAQwB,QAA+BnD,IACnC2B,EAAQyB,aAAevD,IAAY8B,EAAQyB,WAAapD,KAC5DH,EAAatE,GAIVkJ,GAAQf,GAAgBe,EAA7B,CAEAf,EAAee,EACf7C,EAAK6C,KAAOA,EAKN5I,EAAIqB,KAAW0E,EAAK1E,GAAYrB,EAAIqB,IAK1C,IAII0I,EAJAC,EAAO1K,EAAO2K,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG9B,KAC/D,MAAOtD,IACPrF,EAAKqF,IAGP4D,EAAgBqB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBnC,QAAQmC,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGtC,QAAQoC,EAAKE,GAAgB9B,MAGxCK,IAAWX,GACPA,EAASyB,MAxhBH,KAwhBgB,IAAMnJ,EAKhC,IACIgK,EAAetB,EACjBC,EAFWA,GAAeL,IAAiB,EAI3CD,EACAmB,GAIES,EAAsB,WACxB3J,GA7iBU,EA8iBVgF,EAAS0E,IAGX,GAAK1J,EAmBH2J,SAjBA,IACM9I,GAAU2D,EAAW3D,EAAO+I,sBAC9B/I,EACG+I,qBAAqB,CAAC7I,EAAcC,IACpC6I,KAAK,SAAUC,GACd1E,EAAQ2E,QAAUD,EAAkB/I,GACpCqE,EAAQ4E,WAAaF,EAAkB9I,GACvC2I,MAEDM,SAAMN,GAETA,IAEF,MAAO7B,GACP6B,MASNO,GAEA,MAAOpC,IACP/I,EAAK+I,KAhmBT,CAmmBElJ,OACA,uBACA"} \ No newline at end of file diff --git a/src/default.js b/src/default.js index 52107f1..3801b5e 100644 --- a/src/default.js +++ b/src/default.js @@ -783,45 +783,43 @@ var previousReferrer; - // Send page view and append data to it - var sendPageView = function ( + // Capture each accepted pageview before waiting for client hints. + var preparePageView = function ( isPushState, deleteSourceInfo, sameSite, search, - metadata, - callback + metadata ) { if (isPushState) sendOnLeave("" + payload.page_id, trueVar); var originalId = pages === 0 ? pageLoadId : undefinedVar; payload.page_id = originalId || (collectDataOnLeave ? uuid() : undefinedVar); - var currentPage = definedHostname + getPath(); + var currentPage = definedHostname + page.path; var query = getQueryParams(deleteSourceInfo, search); - sendData( - { - id: payload.page_id, - original_id: originalId, - type: originalId ? "append" : pageviewText, - referrer: !deleteSourceInfo || sameSite ? referrer : null, - query: query, - /** if ignoremetrics **/ - k: k, - /** endif **/ - - /** if metadata **/ - metadata: stringify(metadata), - /** endif **/ - }, - callback - ); + var data = assign(page, { + id: payload.page_id, + page_id: payload.page_id, + original_id: originalId, + type: originalId ? "append" : pageviewText, + referrer: !deleteSourceInfo || sameSite ? referrer : null, + query: query, + /** if ignoremetrics **/ + k: k, + /** endif **/ + + /** if metadata **/ + metadata: stringify(metadata), + /** endif **/ + }); previousReferrer = referrer; referrer = currentPage; pages++; + return data; }; var sameSite, userNavigated; @@ -934,18 +932,18 @@ }); /** endif **/ + var delSrc = isPushState || userNavigated || !collectMetricByString("r"); + var pageviewData = preparePageView( + isPushState, + delSrc, // r = referrers + sameSite, + querySearch, + metadata + ); + var triggerSendPageView = function () { fetchedHighEntropyValues = trueVar; - var delSrc = - isPushState || userNavigated || !collectMetricByString("r"); - sendPageView( - isPushState, - delSrc, // r = referrers - sameSite, - querySearch, - metadata, - callback - ); + sendData(pageviewData, callback); }; if (!fetchedHighEntropyValues) { diff --git a/test/unit/page-load-id.test.js b/test/unit/page-load-id.test.js index 6aeb5e8..64c1cc6 100644 --- a/test/unit/page-load-id.test.js +++ b/test/unit/page-load-id.test.js @@ -11,6 +11,78 @@ const requests = (dom) => const wait = () => new Promise((resolve) => setTimeout(resolve, 20)); describe("server page-load ID", function () { + for (const autoCollect of [false, true]) { + for (const reverseResolution of [false, true]) { + it(`preserves two pending ${ + autoCollect ? "automatic" : "manual" + } pageviews with ${ + reverseResolution ? "reversed" : "ordered" + } client hints`, async function () { + const dom = createDOM({ + url: "https://example.com/first?step=one", + settings: { pageLoadId, autoCollect, allowParams: "step" }, + beforeRun(context) { + runInContext( + `window.clientHints = []; + Object.defineProperty(navigator, "userAgentData", { + value: { + brands: [], + mobile: false, + getHighEntropyValues: function() { + return new Promise(function(resolve) { + window.clientHints.push(resolve); + }); + } + } + });`, + context + ); + }, + }); + if (autoCollect) { + dom.window.history.pushState({}, "", "/second?step=two"); + } else { + dom.window.sa_pageview("/first?step=one"); + dom.window.sa_pageview("/second?step=two"); + } + dom.window.sa_event("second_pending"); + const earlyEvent = requests(dom).find( + (params) => params.get("event") === "second_pending" + ); + expect(earlyEvent.get("page_id")).not.to.equal(pageLoadId); + + const resolvers = Array.from(dom.window.clientHints); + expect(resolvers).to.have.lengthOf(2); + if (reverseResolution) resolvers.reverse(); + for (const resolve of resolvers) { + resolve({ platform: "macOS", platformVersion: "15" }); + } + await wait(); + + const pageviews = requests(dom).filter( + (params) => params.get("type") !== "event" && params.has("path") + ); + expect(pageviews).to.have.lengthOf(2); + const initial = pageviews.find( + (params) => params.get("path") === "/first" + ); + expect(initial.get("type")).to.equal("append"); + expect(initial.get("original_id")).to.equal(pageLoadId); + expect(initial.get("page_id")).to.equal(pageLoadId); + expect(initial.get("query")).to.equal("step=one"); + const second = pageviews.find( + (params) => params.get("path") === "/second" + ); + expect(second.get("type")).to.equal("pageview"); + expect(second.has("original_id")).to.equal(false); + expect(second.get("id")).to.equal(earlyEvent.get("page_id")); + expect(second.get("query")).to.equal("step=two"); + expect(second.get("referrer")).to.equal("example.com/first"); + dom.window.close(); + }); + } + } + it("keeps accepted manual attribution while client hints are pending", async function () { const dom = createDOM({ url: "https://example.com/ignore", @@ -196,7 +268,9 @@ describe("server page-load ID", function () { }); for (const settings of [{}, { pageLoadId }]) { - it(`reads the attribute with ${settings.pageLoadId ? "JavaScript precedence" : "no JavaScript setting"}`, async function () { + it(`reads the attribute with ${ + settings.pageLoadId ? "JavaScript precedence" : "no JavaScript setting" + }`, async function () { const dom = createDOM({ settings, beforeRun(context) { @@ -219,7 +293,9 @@ describe("server page-load ID", function () { "not-a-uuid", "e35432dd-4af3-70c3-90ad-5a95d8e4fb1f", ]) { - it(`keeps normal collection for ${invalidId || "an absent ID"}`, async function () { + it(`keeps normal collection for ${ + invalidId || "an absent ID" + }`, async function () { const dom = createDOM({ settings: { pageLoadId: invalidId } }); await wait(); const initial = requests(dom)[0]; From d9ca524da551041ae6acc435cd8fcafe66ab6b2f Mon Sep 17 00:00:00 2001 From: Simple Analytics Codex Date: Tue, 6 Oct 2026 15:53:06 +0200 Subject: [PATCH 9/9] Keep page-load enrichment lightweight Address review feedback: document compiled-byte optimization and public naming in AGENTS.md, leave UUID validation and client-source detection to the queue, and explain the ignored-page leave guard. --- AGENTS.md | 6 ++++++ dist/latest/cloudflare.js | 12 ++---------- dist/latest/custom/app.js | 4 ++-- dist/latest/custom/app.js.map | 2 +- dist/latest/custom/e.js | 4 ++-- dist/latest/custom/e.js.map | 2 +- dist/latest/custom/latest.dev.js | 12 ++---------- dist/latest/custom/latest.js | 4 ++-- dist/latest/custom/latest.js.map | 2 +- dist/latest/custom/light.js | 4 ++-- dist/latest/custom/light.js.map | 2 +- dist/latest/custom/proxy.js | 4 ++-- dist/latest/custom/proxy.js.map | 2 +- dist/latest/hello.js | 4 ++-- dist/latest/hello.js.map | 2 +- dist/latest/latest.dev.js | 12 ++---------- dist/latest/latest.js | 4 ++-- dist/latest/latest.js.map | 2 +- dist/latest/light.js | 4 ++-- dist/latest/light.js.map | 2 +- dist/v12/app.js | 4 ++-- dist/v12/app.js.map | 2 +- dist/v12/custom/app.js | 4 ++-- dist/v12/custom/app.js.map | 2 +- dist/v12/custom/light.js | 4 ++-- dist/v12/custom/light.js.map | 2 +- dist/v12/custom/proxy.js | 4 ++-- dist/v12/custom/proxy.js.map | 2 +- dist/v12/light.js | 4 ++-- dist/v12/light.js.map | 2 +- src/default.js | 10 +--------- test/unit/page-load-id.test.js | 20 +++++++++++++------- 32 files changed, 65 insertions(+), 85 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index c53e96b..76a6c9f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -8,6 +8,12 @@ This repository contains the public scripts for Simple Analytics. When making ch - Run `npm run build` to compile the scripts. This generates the files in `dist/` which should be committed. - Format code with Prettier before committing. You can run `npx prettier -w .` or validate with `npm run prettier`. +## Script size and naming + +- Write code in `src/` to minimize the bytes in the compiled scripts, not just the source. Reuse the predefined variables for repeated values: the compiler turns these into very short variable names, saving bytes wherever they are reused. +- Keep source code readable and check the compiled output and size after building to verify that a change actually saves bytes. +- Names in `overwriteOptions` and script attributes are public settings. Balance short names with readable, human-friendly names, using existing options and attributes as the reference (for example, `ignorePages` / `data-ignore-pages`). These names cannot be shortened by variable minification. + ## Testing - Execute `npm run test:unit` to run the unit tests diff --git a/dist/latest/cloudflare.js b/dist/latest/cloudflare.js index fcebbb2..f2306f9 100644 --- a/dist/latest/cloudflare.js +++ b/dist/latest/cloudflare.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; a888; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-06; 282d; v12) */ /* eslint-env browser */ (function ( @@ -147,14 +147,6 @@ // A server-created initial pageview can be enriched by this script. var pageLoadId = overwriteOptions.pageLoadId || attr(scriptElement, "page-load-id"); - if ( - typeof pageLoadId !== "string" || - !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test( - pageLoadId - ) - ) { - pageLoadId = undefinedVar; - } // Customers can skip data points var ignoreMetrics = convertCommaSeparatedToArray( @@ -483,7 +475,6 @@ https: loc.protocol == https, timezone: timezone, - collected_client_side: trueVar, page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar), // se = sessions @@ -566,6 +557,7 @@ var sendOnLeave = function (id, push) { if (!collectDataOnLeave) return; + // Don't enrich an ignored server page before an allowed manual pageview. if (pageLoadId && !lastSendPath && !getPath()) return; var append = assign(basePayload, { diff --git a/dist/latest/custom/app.js b/dist/latest/custom/app.js index e4f3f78..b32fc7b 100644 --- a/dist/latest/custom/app.js +++ b/dist/latest/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; eb51; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-06; 6909; v12) */ -!function(g,t,e,n,m){try{var v=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=g.console,c="doNotTrack",b=g.navigator,s=g.location,O=s.host,l=g.document,p=b.userAgent,f="Not sending request ",d=f+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=g.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=g.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=g[st+"_metadata"];Z(n)&&(t=K(t,n));var r=g[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(g,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==_&&0"); +!function(g,t,e,n,m){try{var v=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=g.console,c="doNotTrack",b=g.navigator,s=g.location,O=s.host,l=g.document,p=b.userAgent,d="Not sending request ",f=d+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=g.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=g.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=g[st+"_metadata"];Z(n)&&(t=K(t,n));var r=g[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(g,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){tt=!i&&rt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/latest/custom/app.js.map b/dist/latest/custom/app.js.map index 920ab36..eb9f74f 100644 --- a/dist/latest/custom/app.js.map +++ b/dist/latest/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n // Don't enrich an ignored server page before an allowed manual pageview.\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","pageLoadId","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/e.js b/dist/latest/custom/e.js index be13a83..55c9141 100644 --- a/dist/latest/custom/e.js +++ b/dist/latest/custom/e.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; 5768; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-06; f76e; v12) */ -!function(g,t,e,n,m){try{var v=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=g.console,c="doNotTrack",b=g.navigator,s=g.location,O=s.host,l=g.document,p=b.userAgent,f="Not sending request ",d=f+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=g.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=g.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=g[st+"_metadata"];Z(n)&&(t=K(t,n));var r=g[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(g,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==_&&0"); +!function(g,t,e,n,m){try{var v=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=g.console,c="doNotTrack",b=g.navigator,s=g.location,O=s.host,l=g.document,p=b.userAgent,d="Not sending request ",f=d+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=g.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=g.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=g[st+"_metadata"];Z(n)&&(t=K(t,n));var r=g[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(g,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){tt=!i&&rt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=e.js.map \ No newline at end of file diff --git a/dist/latest/custom/e.js.map b/dist/latest/custom/e.js.map index 5079bc9..45dc3ba 100644 --- a/dist/latest/custom/e.js.map +++ b/dist/latest/custom/e.js.map @@ -1 +1 @@ -{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n // Don't enrich an ignored server page before an allowed manual pageview.\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","pageLoadId","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/latest.dev.js b/dist/latest/custom/latest.dev.js index b4116d9..102803d 100644 --- a/dist/latest/custom/latest.dev.js +++ b/dist/latest/custom/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; f156; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-06; 0713; v12) */ /* eslint-env browser */ (function ( @@ -145,14 +145,6 @@ // A server-created initial pageview can be enriched by this script. var pageLoadId = overwriteOptions.pageLoadId || attr(scriptElement, "page-load-id"); - if ( - typeof pageLoadId !== "string" || - !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test( - pageLoadId - ) - ) { - pageLoadId = undefinedVar; - } // Customers can skip data points var ignoreMetrics = convertCommaSeparatedToArray( @@ -482,7 +474,6 @@ https: loc.protocol == https, timezone: timezone, - collected_client_side: trueVar, page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar), // se = sessions @@ -566,6 +557,7 @@ var sendOnLeave = function (id, push) { if (!collectDataOnLeave) return; + // Don't enrich an ignored server page before an allowed manual pageview. if (pageLoadId && !lastSendPath && !getPath()) return; var append = assign(basePayload, { diff --git a/dist/latest/custom/latest.js b/dist/latest/custom/latest.js index b60e161..a8a9280 100644 --- a/dist/latest/custom/latest.js +++ b/dist/latest/custom/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; df5d; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-06; 97df; v12) */ -!function(g,t,e,n,m){try{var v=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=g.console,c="doNotTrack",b=g.navigator,s=g.location,O=s.host,l=g.document,p=b.userAgent,f="Not sending request ",d=f+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=g.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=g.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=g[st+"_metadata"];Z(n)&&(t=K(t,n));var r=g[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(g,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==_&&0"); +!function(g,t,e,n,m){try{var v=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=g.console,c="doNotTrack",b=g.navigator,s=g.location,O=s.host,l=g.document,p=b.userAgent,d="Not sending request ",f=d+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=g.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=g.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=g[st+"_metadata"];Z(n)&&(t=K(t,n));var r=g[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(g,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){tt=!i&&rt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=latest.js.map \ No newline at end of file diff --git a/dist/latest/custom/latest.js.map b/dist/latest/custom/latest.js.map index df56782..e2f6cb6 100644 --- a/dist/latest/custom/latest.js.map +++ b/dist/latest/custom/latest.js.map @@ -1 +1 @@ -{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n // Don't enrich an ignored server page before an allowed manual pageview.\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","pageLoadId","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/light.js b/dist/latest/custom/light.js index 9173893..bf19cfd 100644 --- a/dist/latest/custom/light.js +++ b/dist/latest/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; 1247; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-06; da47; v12) */ -!function(f,e,t,g){try{var m=undefined,n="https:",r=f.console,a="doNotTrack",h=f.navigator,d=f.location,v=d.host,i=f.document,o=h.userAgent,c="Not sending request ",y=!1,s=encodeURIComponent,p=decodeURIComponent,u=JSON.stringify,l=f.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=h.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,x=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');g=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var $=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},I=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||A(E,V)||"sa",C=e.strictUtm||"true"==A(E,"strict-utm"),H=B+"_loaded";if(1==f[H])return g(c+"twice");f.sa_event_loaded=!0,f[H]=!0;var T,F=function(t,e,n){t=n?t:I(M,Z,t),h.brave&&!n&&(t.brave=!0),h._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||A(E,"hostname"),z=L||v,J={version:"custom_light_12",hostname:z};e.mode||A(E,"mode");try{T=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){g(ee)}x&&(J.bot=!0);var M=I(J,{ua:o,https:d.protocol==n,timezone:T,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!1,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==v&&(M.hostname_original=v),a in h&&"1"==h[a])return g("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=v.indexOf(".")&&!/^[0-9.:]+$/.test(v)||L||g("Set hostname on "+v+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||A(E,"referrer")||i.referrer||"").replace(v,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,K=function(e,t){if(0,!N||P||X()){var n=I(J,{type:"append",original_id:t?e:M.page_id});if(t||!h.sendBeacon)F(n,0,!0);else try{h.sendBeacon.bind(h)(_+"/append",u(n))}catch(r){F(n,0,!0)}}};l("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){g(ee)}return t},Y=function(e,t,n,r,a){e&&K(""+M.page_id,!0);var i=0===k?N:m;M.page_id=i||R();var o,c=z+Z.path,s=(o=t,(r||d.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||m),p=I(Z,{id:M.page_id,page_id:M.page_id,original_id:i,type:i?"append":"pageview",referrer:!t||n?G:null,query:s});return G=c,k++,p};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);$(t)&&-1"); +!function(f,e,t,g){try{var m=undefined,n="https:",r=f.console,i="doNotTrack",h=f.navigator,d=f.location,v=d.host,a=f.document,o=h.userAgent,c="Not sending request ",y=!1,s=encodeURIComponent,p=decodeURIComponent,u=JSON.stringify,l=f.addEventListener,_="https://"+t,b=(a.documentElement,"language"),w=h.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,x=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=a.currentScript||a.querySelector('script[src*="'+t+'"]');g=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var A=function(e){return"string"==typeof e},I=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},i=arguments,a=0;a>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}}),U=function(e){return"function"==typeof e},V="namespace",B=e[V]||I(E,V)||"sa",C=e.strictUtm||"true"==I(E,"strict-utm"),H=B+"_loaded";if(1==f[H])return g(c+"twice");f.sa_event_loaded=!0,f[H]=!0;var T,F=function(t,e,n){t=n?t:$(M,Z,t),h.brave&&!n&&(t.brave=!0),h._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||I(E,"hostname"),z=L||v,J={version:"custom_light_12",hostname:z};e.mode||I(E,"mode");try{T=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){g(ee)}x&&(J.bot=!0);var M=$(J,{ua:o,https:d.protocol==n,timezone:T,page_id:N||R(),session_id:N||R()});if(M.sri=!1,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==v&&(M.hostname_original=v),i in h&&"1"==h[i])return g("Not sending request when "+i+" is enabled. See "+j+"/dnt");-1!=v.indexOf(".")&&!/^[0-9.:]+$/.test(v)||L||g("Set hostname on "+v+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||I(E,"referrer")||a.referrer||"").replace(v,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,K=function(e,t){if(0,!N||P||X()){var n=$(J,{type:"append",original_id:t?e:M.page_id});if(t||!h.sendBeacon)F(n,0,!0);else try{h.sendBeacon.bind(h)(_+"/append",u(n))}catch(r){F(n,0,!0)}}};l("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){g(ee)}return t},Y=function(e,t,n,r,i){e&&K(""+M.page_id,!0);var a=0===k?N:m;M.page_id=a||R();var o,c=z+Z.path,s=(o=t,(r||d.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||m),p=$(Z,{id:M.page_id,page_id:M.page_id,original_id:a,type:a?"append":"pageview",referrer:!t||n?G:null,query:s});return G=c,k++,p};!function(e,t,n,r){!r&&U(n)&&(r=n);var i,a;U(r);A(t)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/latest/custom/light.js.map b/dist/latest/custom/light.js.map index edb8c3f..d89fed7 100644 --- a/dist/latest/custom/light.js.map +++ b/dist/latest/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","preparePageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","pageviewData","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n // Don't enrich an ignored server page before an allowed manual pageview.\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","uuid","Date","now","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","preparePageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","pageviewData","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/proxy.js b/dist/latest/custom/proxy.js index 9e71007..a8581bf 100644 --- a/dist/latest/custom/proxy.js +++ b/dist/latest/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; 94c9; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-06; 3b46; v12) */ -!function(g,t,e,n,m){try{var v=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=g.console,c="doNotTrack",b=g.navigator,s=g.location,x=s.host,l=g.document,p=b.userAgent,f="Not sending request ",d=f+"when ",O=_,h=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=g.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",I="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=g.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=g[st+"_metadata"];Z(n)&&(t=K(t,n));var r=g[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(g,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==_&&0"); +!function(g,t,e,n,m){try{var v=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=g.console,c="doNotTrack",b=g.navigator,s=g.location,x=s.host,l=g.document,p=b.userAgent,d="Not sending request ",f=d+"when ",O=_,h=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=g.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",I="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=g.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=g[st+"_metadata"];Z(n)&&(t=K(t,n));var r=g[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(g,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){tt=!i&&rt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/latest/custom/proxy.js.map b/dist/latest/custom/proxy.js.map index 9832dd9..2f0b9bc 100644 --- a/dist/latest/custom/proxy.js.map +++ b/dist/latest/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n // Don't enrich an ignored server page before an allowed manual pageview.\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","pageLoadId","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/hello.js b/dist/latest/hello.js index 0b9c3f9..9809640 100644 --- a/dist/latest/hello.js +++ b/dist/latest/hello.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; cfa6) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-06; aa6b) */ -!function(g,e,t,n,m){try{var v=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=g.console,c="doNotTrack",b=g.navigator,s=g.location,O=s.host,l=g.document,p=b.userAgent,f="Not sending request ",d=f+"when ",E=_,h=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=g.addEventListener,q="https://queue."+t,M=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,R="offset"+$,H="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=g.screen,z=l.currentScript||l.querySelector('script[src*="'+t+'"]');m=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,e)};var F=function(e,t){m("Error in your "+e+" function:",t)},L=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},W=function(e){return"string"==typeof e},G=function(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(e,t){return e&&e.getAttribute("data-"+t)},Y=function(e){return Array.isArray(e)?e:W(e)&&e.length?e.split(/, ?/):[]},Z=function(e){return e&&e.constructor===Object},K=function(){for(var e={},t=arguments,n=0;n>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},oe=function(e){return"function"==typeof e},ce="namespace",se=e[ce]||J(z,ce)||"sa",ue=function(e,t){var n=g[se+"_metadata"];Z(n)&&(e=K(e,n));var r=g[Me];if(!oe(r))return Me&&m(Me+" not found, set window."+Me),e;try{return K(e,r.call(g,K(e,t)))}catch(a){F("metadata",a)}},le=e.strictUtm||J(z,"strict-utm")==r,pe=function(i,e){te=!i&&re("q")?"":_;var t=(e||s.search).slice(1).split("&").filter(function(e){var t=e.indexOf("=");te!==_&&0>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},oe=function(e){return"function"==typeof e},ce="namespace",se=e[ce]||J(z,ce)||"sa",ue=function(e,t){var n=g[se+"_metadata"];Z(n)&&(e=K(e,n));var r=g[Me];if(!oe(r))return Me&&m(Me+" not found, set window."+Me),e;try{return K(e,r.call(g,K(e,t)))}catch(a){F("metadata",a)}},le=e.strictUtm||J(z,"strict-utm")==r,pe=function(i,e){ee=!i&&re("q")?"":_;var t=(e||s.search).slice(1).split("&").filter(function(e){var t=e.indexOf("=");ee!==_&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"hello.source.js","sources":["hello.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n // Don't enrich an ignored server page before an allowed manual pageview.\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","pageLoadId","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/latest.dev.js b/dist/latest/latest.dev.js index a588428..7eeed93 100644 --- a/dist/latest/latest.dev.js +++ b/dist/latest/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; 5e3b; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-06; 07eb; v12) */ /* eslint-env browser */ (function ( @@ -145,14 +145,6 @@ // A server-created initial pageview can be enriched by this script. var pageLoadId = overwriteOptions.pageLoadId || attr(scriptElement, "page-load-id"); - if ( - typeof pageLoadId !== "string" || - !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test( - pageLoadId - ) - ) { - pageLoadId = undefinedVar; - } // Customers can skip data points var ignoreMetrics = convertCommaSeparatedToArray( @@ -482,7 +474,6 @@ https: loc.protocol == https, timezone: timezone, - collected_client_side: trueVar, page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar), // se = sessions @@ -566,6 +557,7 @@ var sendOnLeave = function (id, push) { if (!collectDataOnLeave) return; + // Don't enrich an ignored server page before an allowed manual pageview. if (pageLoadId && !lastSendPath && !getPath()) return; var append = assign(basePayload, { diff --git a/dist/latest/latest.js b/dist/latest/latest.js index 3f30d11..b523c06 100644 --- a/dist/latest/latest.js +++ b/dist/latest/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; 2354; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-06; cd80; v12) */ -!function(g,e,t,n,m){try{var v=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=g.console,c="doNotTrack",b=g.navigator,s=g.location,O=s.host,l=g.document,p=b.userAgent,f="Not sending request ",d=f+"when ",E=_,h=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=g.addEventListener,q="https://queue."+t,M=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,R="offset"+$,H="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=g.screen,z=l.currentScript||l.querySelector('script[src*="'+t+'"]');m=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,e)};var F=function(e,t){m("Error in your "+e+" function:",t)},L=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},W=function(e){return"string"==typeof e},G=function(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(e,t){return e&&e.getAttribute("data-"+t)},Y=function(e){return Array.isArray(e)?e:W(e)&&e.length?e.split(/, ?/):[]},Z=function(e){return e&&e.constructor===Object},K=function(){for(var e={},t=arguments,n=0;n>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},oe=function(e){return"function"==typeof e},ce="namespace",se=e[ce]||J(z,ce)||"sa",ue=function(e,t){var n=g[se+"_metadata"];Z(n)&&(e=K(e,n));var r=g[Me];if(!oe(r))return Me&&m(Me+" not found, set window."+Me),e;try{return K(e,r.call(g,K(e,t)))}catch(a){F("metadata",a)}},le=e.strictUtm||J(z,"strict-utm")==r,pe=function(i,e){te=!i&&re("q")?"":_;var t=(e||s.search).slice(1).split("&").filter(function(e){var t=e.indexOf("=");te!==_&&0>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},oe=function(e){return"function"==typeof e},ce="namespace",se=e[ce]||J(z,ce)||"sa",ue=function(e,t){var n=g[se+"_metadata"];Z(n)&&(e=K(e,n));var r=g[Me];if(!oe(r))return Me&&m(Me+" not found, set window."+Me),e;try{return K(e,r.call(g,K(e,t)))}catch(a){F("metadata",a)}},le=e.strictUtm||J(z,"strict-utm")==r,pe=function(i,e){ee=!i&&re("q")?"":_;var t=(e||s.search).slice(1).split("&").filter(function(e){var t=e.indexOf("=");ee!==_&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n // Don't enrich an ignored server page before an allowed manual pageview.\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","pageLoadId","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/light.js b/dist/latest/light.js index c3a4d03..29b64bd 100644 --- a/dist/latest/light.js +++ b/dist/latest/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; 10ca; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-06; 3731; v12) */ -!function(f,e,t,g){try{var m=undefined,n="https:",r=f.console,a="doNotTrack",h=f.navigator,d=f.location,v=d.host,i=f.document,o=h.userAgent,c="Not sending request ",y=!1,s=encodeURIComponent,p=decodeURIComponent,u=JSON.stringify,l=f.addEventListener,_="https://queue."+t,b=(i.documentElement,"language"),w=h.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,E=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),$=i.currentScript||i.querySelector('script[src*="'+t+'"]');g=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||x($,V)||"sa",C=e.strictUtm||"true"==x($,"strict-utm"),T=B+"_loaded";if(1==f[T])return g(c+"twice");f.sa_event_loaded=!0,f[T]=!0;var F,H=function(t,e,n){t=n?t:A(M,Z,t),h.brave&&!n&&(t.brave=!0),h._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||x($,"hostname"),z=L||v,J={version:"cdn_light_12",hostname:z};e.mode||x($,"mode");try{F=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){g(ee)}E&&(J.bot=!0);var M=A(J,{ua:o,https:d.protocol==n,timezone:F,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!1,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==v&&(M.hostname_original=v),a in h&&"1"==h[a])return g("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=v.indexOf(".")&&!/^[0-9.:]+$/.test(v)||L||g("Set hostname on "+v+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||x($,"referrer")||i.referrer||"").replace(v,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,K=function(e,t){if(0,!N||P||X()){var n=A(J,{type:"append",original_id:t?e:M.page_id});if(t||!h.sendBeacon)H(n,0,!0);else try{h.sendBeacon.bind(h)(_+"/append",u(n))}catch(r){H(n,0,!0)}}};l("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){g(ee)}return t},Y=function(e,t,n,r,a){e&&K(""+M.page_id,!0);var i=0===k?N:m;M.page_id=i||R();var o,c=z+Z.path,s=(o=t,(r||d.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||m),p=A(Z,{id:M.page_id,page_id:M.page_id,original_id:i,type:i?"append":"pageview",referrer:!t||n?G:null,query:s});return G=c,k++,p};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);q(t)&&-1>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}}),U=function(e){return"function"==typeof e},V="namespace",B=e[V]||A(q,V)||"sa",C=e.strictUtm||"true"==A(q,"strict-utm"),T=B+"_loaded";if(1==f[T])return m(c+"twice");f.sa_event_loaded=!0,f[T]=!0;var F,H=function(t,e,n){t=n?t:I(M,Z,t),h.brave&&!n&&(t.brave=!0),h._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=g}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||A(q,"hostname"),z=L||v,J={version:"cdn_light_12",hostname:z};e.mode||A(q,"mode");try{F=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){m(ee)}E&&(J.bot=!0);var M=I(J,{ua:o,https:d.protocol==n,timezone:F,page_id:N||R(),session_id:N||R()});if(M.sri=!1,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==v&&(M.hostname_original=v),i in h&&"1"==h[i])return m("Not sending request when "+i+" is enabled. See "+j+"/dnt");-1!=v.indexOf(".")&&!/^[0-9.:]+$/.test(v)||L||m("Set hostname on "+v+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||A(q,"referrer")||a.referrer||"").replace(v,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||g,K=function(e,t){if(0,!N||P||X()){var n=I(J,{type:"append",original_id:t?e:M.page_id});if(t||!h.sendBeacon)H(n,0,!0);else try{h.sendBeacon.bind(h)(_+"/append",u(n))}catch(r){H(n,0,!0)}}};l("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){m(ee)}return t},Y=function(e,t,n,r,i){e&&K(""+M.page_id,!0);var a=0===k?N:g;M.page_id=a||R();var o,c=z+Z.path,s=(o=t,(r||d.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||g),p=I(Z,{id:M.page_id,page_id:M.page_id,original_id:a,type:a?"append":"pageview",referrer:!t||n?G:null,query:s});return G=c,k++,p};!function(e,t,n,r){!r&&U(n)&&(r=n);var i,a;U(r);x(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","preparePageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","pageviewData","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n // Don't enrich an ignored server page before an allowed manual pageview.\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","uuid","Date","now","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","preparePageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","pageviewData","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/app.js b/dist/v12/app.js index 814f1ca..4185b7f 100644 --- a/dist/v12/app.js +++ b/dist/v12/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; 033c; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-06; 606e; SRI-version; v12) */ -!function(g,e,t,n,m){try{var v=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=g.console,c="doNotTrack",b=g.navigator,s=g.location,O=s.host,l=g.document,p=b.userAgent,f="Not sending request ",d=f+"when ",E=_,h=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=g.addEventListener,q="https://queue."+t,M=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,R="offset"+$,H="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=g.screen,z=l.currentScript||l.querySelector('script[src*="'+t+'"]');m=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,e)};var F=function(e,t){m("Error in your "+e+" function:",t)},L=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},W=function(e){return"string"==typeof e},G=function(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(e,t){return e&&e.getAttribute("data-"+t)},Y=function(e){return Array.isArray(e)?e:W(e)&&e.length?e.split(/, ?/):[]},Z=function(e){return e&&e.constructor===Object},K=function(){for(var e={},t=arguments,n=0;n>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},oe=function(e){return"function"==typeof e},ce="namespace",se=e[ce]||J(z,ce)||"sa",ue=function(e,t){var n=g[se+"_metadata"];Z(n)&&(e=K(e,n));var r=g[Me];if(!oe(r))return Me&&m(Me+" not found, set window."+Me),e;try{return K(e,r.call(g,K(e,t)))}catch(a){F("metadata",a)}},le=e.strictUtm||J(z,"strict-utm")==r,pe=function(i,e){te=!i&&re("q")?"":_;var t=(e||s.search).slice(1).split("&").filter(function(e){var t=e.indexOf("=");te!==_&&0>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},oe=function(e){return"function"==typeof e},ce="namespace",se=e[ce]||J(z,ce)||"sa",ue=function(e,t){var n=g[se+"_metadata"];Z(n)&&(e=K(e,n));var r=g[Me];if(!oe(r))return Me&&m(Me+" not found, set window."+Me),e;try{return K(e,r.call(g,K(e,t)))}catch(a){F("metadata",a)}},le=e.strictUtm||J(z,"strict-utm")==r,pe=function(i,e){ee=!i&&re("q")?"":_;var t=(e||s.search).slice(1).split("&").filter(function(e){var t=e.indexOf("=");ee!==_&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.js","sources":["app.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n // Don't enrich an ignored server page before an allowed manual pageview.\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","pageLoadId","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/app.js b/dist/v12/custom/app.js index cb87970..6325f34 100644 --- a/dist/v12/custom/app.js +++ b/dist/v12/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; 39f9; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-06; a92c; SRI-version; v12) */ -!function(g,t,e,n,m){try{var v=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=g.console,c="doNotTrack",b=g.navigator,s=g.location,O=s.host,l=g.document,p=b.userAgent,f="Not sending request ",d=f+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=g.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=g.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=g[st+"_metadata"];Z(n)&&(t=K(t,n));var r=g[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(g,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==_&&0"); +!function(g,t,e,n,m){try{var v=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=g.console,c="doNotTrack",b=g.navigator,s=g.location,O=s.host,l=g.document,p=b.userAgent,d="Not sending request ",f=d+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=g.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=g.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=g[st+"_metadata"];Z(n)&&(t=K(t,n));var r=g[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(g,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){tt=!i&&rt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v12/custom/app.js.map b/dist/v12/custom/app.js.map index 82e6d42..591ef34 100644 --- a/dist/v12/custom/app.js.map +++ b/dist/v12/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n // Don't enrich an ignored server page before an allowed manual pageview.\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","pageLoadId","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/light.js b/dist/v12/custom/light.js index d9adaa9..e24df85 100644 --- a/dist/v12/custom/light.js +++ b/dist/v12/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; 401c; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-06; 5580; SRI-version; v12) */ -!function(f,e,t,g){try{var m=undefined,n="https:",r=f.console,a="doNotTrack",h=f.navigator,d=f.location,v=d.host,i=f.document,o=h.userAgent,c="Not sending request ",y=!1,s=encodeURIComponent,p=decodeURIComponent,u=JSON.stringify,l=f.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=h.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,x=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');g=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var $=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},I=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||A(E,V)||"sa",C=e.strictUtm||"true"==A(E,"strict-utm"),H=B+"_loaded";if(1==f[H])return g(c+"twice");f.sa_event_loaded=!0,f[H]=!0;var T,F=function(t,e,n){t=n?t:I(M,Z,t),h.brave&&!n&&(t.brave=!0),h._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||A(E,"hostname"),z=L||v,J={version:"custom_light_12",hostname:z};e.mode||A(E,"mode");try{T=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){g(ee)}x&&(J.bot=!0);var M=I(J,{ua:o,https:d.protocol==n,timezone:T,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!0,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==v&&(M.hostname_original=v),a in h&&"1"==h[a])return g("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=v.indexOf(".")&&!/^[0-9.:]+$/.test(v)||L||g("Set hostname on "+v+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||A(E,"referrer")||i.referrer||"").replace(v,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,K=function(e,t){if(0,!N||P||X()){var n=I(J,{type:"append",original_id:t?e:M.page_id});if(t||!h.sendBeacon)F(n,0,!0);else try{h.sendBeacon.bind(h)(_+"/append",u(n))}catch(r){F(n,0,!0)}}};l("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){g(ee)}return t},Y=function(e,t,n,r,a){e&&K(""+M.page_id,!0);var i=0===k?N:m;M.page_id=i||R();var o,c=z+Z.path,s=(o=t,(r||d.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||m),p=I(Z,{id:M.page_id,page_id:M.page_id,original_id:i,type:i?"append":"pageview",referrer:!t||n?G:null,query:s});return G=c,k++,p};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);$(t)&&-1"); +!function(f,e,t,g){try{var m=undefined,n="https:",r=f.console,i="doNotTrack",h=f.navigator,d=f.location,v=d.host,a=f.document,o=h.userAgent,c="Not sending request ",y=!1,s=encodeURIComponent,p=decodeURIComponent,u=JSON.stringify,l=f.addEventListener,_="https://"+t,b=(a.documentElement,"language"),w=h.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,x=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=a.currentScript||a.querySelector('script[src*="'+t+'"]');g=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var A=function(e){return"string"==typeof e},I=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},i=arguments,a=0;a>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}}),U=function(e){return"function"==typeof e},V="namespace",B=e[V]||I(E,V)||"sa",C=e.strictUtm||"true"==I(E,"strict-utm"),H=B+"_loaded";if(1==f[H])return g(c+"twice");f.sa_event_loaded=!0,f[H]=!0;var T,F=function(t,e,n){t=n?t:$(M,Z,t),h.brave&&!n&&(t.brave=!0),h._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||I(E,"hostname"),z=L||v,J={version:"custom_light_12",hostname:z};e.mode||I(E,"mode");try{T=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){g(ee)}x&&(J.bot=!0);var M=$(J,{ua:o,https:d.protocol==n,timezone:T,page_id:N||R(),session_id:N||R()});if(M.sri=!0,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==v&&(M.hostname_original=v),i in h&&"1"==h[i])return g("Not sending request when "+i+" is enabled. See "+j+"/dnt");-1!=v.indexOf(".")&&!/^[0-9.:]+$/.test(v)||L||g("Set hostname on "+v+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||I(E,"referrer")||a.referrer||"").replace(v,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,K=function(e,t){if(0,!N||P||X()){var n=$(J,{type:"append",original_id:t?e:M.page_id});if(t||!h.sendBeacon)F(n,0,!0);else try{h.sendBeacon.bind(h)(_+"/append",u(n))}catch(r){F(n,0,!0)}}};l("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){g(ee)}return t},Y=function(e,t,n,r,i){e&&K(""+M.page_id,!0);var a=0===k?N:m;M.page_id=a||R();var o,c=z+Z.path,s=(o=t,(r||d.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||m),p=$(Z,{id:M.page_id,page_id:M.page_id,original_id:a,type:a?"append":"pageview",referrer:!t||n?G:null,query:s});return G=c,k++,p};!function(e,t,n,r){!r&&U(n)&&(r=n);var i,a;U(r);A(t)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v12/custom/light.js.map b/dist/v12/custom/light.js.map index a010aa3..61f93a0 100644 --- a/dist/v12/custom/light.js.map +++ b/dist/v12/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","preparePageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","pageviewData","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n // Don't enrich an ignored server page before an allowed manual pageview.\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","uuid","Date","now","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","preparePageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","pageviewData","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/proxy.js b/dist/v12/custom/proxy.js index 07b8f25..eb54145 100644 --- a/dist/v12/custom/proxy.js +++ b/dist/v12/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; 4e68; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-06; 070d; SRI-version; v12) */ -!function(g,t,e,n,m){try{var v=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=g.console,c="doNotTrack",b=g.navigator,s=g.location,x=s.host,l=g.document,p=b.userAgent,f="Not sending request ",d=f+"when ",O=_,h=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=g.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",I="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=g.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=g[st+"_metadata"];Z(n)&&(t=K(t,n));var r=g[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(g,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){et=!i&&rt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");et!==_&&0"); +!function(g,t,e,n,m){try{var v=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=g.console,c="doNotTrack",b=g.navigator,s=g.location,x=s.host,l=g.document,p=b.userAgent,d="Not sending request ",f=d+"when ",O=_,h=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=g.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",I="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=g.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=g[st+"_metadata"];Z(n)&&(t=K(t,n));var r=g[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(g,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){tt=!i&&rt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v12/custom/proxy.js.map b/dist/v12/custom/proxy.js.map index 1090e9f..cba0523 100644 --- a/dist/v12/custom/proxy.js.map +++ b/dist/v12/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n if (\n typeof pageLoadId !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n pageLoadId\n )\n ) {\n pageLoadId = undefinedVar;\n }\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","pageLoadId","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","collected_client_side","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n // Don't enrich an ignored server page before an allowed manual pageview.\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","pageLoadId","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAhBW3B,WAgB4BR,EACvCoC,EAAkBf,EAAIe,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAASzB,EAAI0B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK5B,KAAe,WAAW4B,KAAK5B,GACxD6B,EAAStD,EAAOsD,OAIhBC,EACFhC,EAAIiC,eAAiBjC,EAAIkC,cAAc,gBAAkBvD,EAAU,MAOrEE,EAAO,WAEL,IAAIsD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK9C,EAAIV,KAAMU,EAAK4C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnChE,EAAK,iBAAmB+D,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWjG,EAAOkG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKnG,GAAkBqF,OAG5DrF,EAAmB0F,EAAO1F,EAAkBgG,GAExCE,GAAa/F,EAAK,WAAYH,GAGlC,IAmFIoG,GAnFAC,GACFrG,EAAiBqG,YAAcvB,EAAKxB,EAAe,gBAGjDgD,GAAgBrB,EAClBjF,EAAiBsG,eAAiBxB,EAAKxB,EAAe,mBAGpDiD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU7B,GAC7B,OAAO,IAAI8B,OAAO,IAAMF,GAAoBpD,KAAKwB,KAChDS,QAIHsB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe/G,EAAOgH,QAAUhH,EAAOiH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOnD,GACP,OAAO8C,EAAUpC,QAAQqC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF7H,EAAiB4H,KACjB9C,EAAKxB,EAAesE,KAmzBxB,KAhzBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBlI,EAAO8H,GAAY,aACpCtC,EAAS0C,KAAiBF,EAAWrC,EAAOqC,EAAUE,IAC1D,IAAIC,EAA4BnI,EAAOoI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACFhI,EACEgI,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOrC,EACLqC,EACAG,EAA0BvE,KAAK5D,EAAQ2F,EAAOqC,EAAUC,KAE1D,MAAO7D,GACPF,EAAe,WAAYE,KAU3BiE,GACFpI,EAAiBoI,WACjBtD,EAAKxB,EAAe,eAAiB9C,EAInC6H,GAAiB,SAAUC,EAAcC,GAC3CnC,IAAKkC,GAAgB/B,GAAsB,KAAO,GAAKhG,EACvD,IAAIiI,GAAKD,GAAmBrH,EAAIuH,QAC7B/E,MAAM,GACN4B,MAAM,KACNmB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBxC,KAAM7F,GAAgB,EAAJoI,GAASD,EAAShF,MAAMiF,EAAI,KAChDvC,KAAMA,GAAI,IAAM,IAAMsC,EAAShF,MAAM,EAAGiF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIrE,GAAasE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAY1D,OAAe9E,EAInC,IAAImG,OAAOwC,EAAO,KAAK9F,KAAKsF,KAEpCO,KAAK,KAGR,OADA7C,GAAIA,IAAKhG,EACFoI,GAAKpI,GA+BV+I,GAAiBtB,GAAY,UACjC,GAAI9H,EAAOoJ,KAAmB7I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOqJ,gBAAkB9I,EACzBP,EAAOoJ,IAAkB7I,EAOzB,IAAI+I,GAAW,SAAUrB,EAAMsB,EAAUC,GACvCvB,EAAOuB,EAAevB,EAAOtC,EAAO8D,GAASC,GAAMzB,GAE/ChH,EAAI0I,QAAUH,IAAcvB,EAAK0B,MAAQpJ,GACzCU,EAAI2I,qBAAuBJ,IAAcvB,EAAK4B,KAAOtJ,GAGzD,IAAIuJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJ7H,EACA,eACAmC,OAAO4B,KAAK6B,GACTvB,OAAO,SAAUyD,GAChB,OAAOlC,EAAKkC,IAAQ9J,IAErB4I,IAAI,SAAUkB,GACb,OACEtI,EAAuBsI,GACvB,IACAtI,EAAuBoG,EAAKkC,MAG/BjB,KAAK,KACR,SACArC,KAAKD,OAILwD,GACFnK,EAAiBoK,UAAYtF,EAAKxB,EAAe,YAC/C+G,GAAkBF,IAAuB/I,EAEzCkJ,GAAc,CAChBC,QAiqBJ,kBAhqBIH,SAAUC,IASZnK,EAAY,SAAUsK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJrK,EAAKqK,GACLnB,GACE3D,EAAO4E,GAAa,CAClBI,KAAM9J,EACNuD,MAAOqG,EACPG,KAAMzJ,EAAI0J,WAEZxK,EACAE,IAMJ4B,EACEtB,EACA,SAAUiK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASlC,QAAQ3I,IAC3CC,EAAU2K,EAAME,UAGpBxK,GAOF,IAwDIyK,GAxDAC,GAAQtE,KAERuE,GAAW,EAOXC,GAAOnL,EAAiBmL,MAAQrG,EAAKxB,EAAe,QAGpD8H,MA/KsBC,GA+KCrL,EAAiBoL,cA9KvBC,GA+KjBrL,EAAiBoL,WACjBtG,EAAKxB,EAAe,eAAiB9C,GACrCsE,EAAKxB,EAAe,aAAe9C,GACnCsE,EAAKxB,EAAe,gBAAkB9C,EAGtC8K,KACqC,SAAvCxG,EAAKxB,EAAe,iBACpBtD,EAAiBsL,cAAgB/K,GAI/BgL,GACFvL,EAAiBwL,UACjB1G,EAAKxB,EAAe,cACpBuE,GAAY,IAAMlH,EAGhB8K,GAAcxG,EAChBjF,EAAiByL,aAAe3G,EAAKxB,EAAe,iBAIlDyF,GAAc9D,EAChBjF,EAAiB+I,aAAejE,EAAKxB,EAAe,iBAIlDoI,GAAqBzG,EACvBjF,EAAiB0L,oBACf5G,EAAKxB,EAAe,yBAIpBqI,GACF3L,EAAiB2L,gBAAkB7G,EAAKxB,EAAe,mBAGrD6E,GACFnI,EAAiBmI,mBACjBrD,EAAKxB,EAAe,sBAItB,IAEE0H,GAAWzE,GAAsB,KAC7BqF,KAAKC,iBAAiBC,kBAAkBC,SACxC3L,EACJ,MAAO+D,IACPhE,EAAKgE,IAOP,IAAI6H,GAAUjM,EAAOiM,QACjBC,GACFjL,EAAIkL,WACJnM,EAAOoM,aACPpM,EAAOqM,aACPrM,EAAOsM,UACNL,KAAYA,GAAQM,QACrBvM,EAAOwM,YACPxM,EAAOyM,MACPrJ,GACAqE,KAAKC,UAAYD,KAAKC,SAGpBgF,GACFlG,GAAsB,MAAQA,GAAsB,QAElD0F,KAAK3B,GAAY2B,IAAM3L,GAE3B,IAAIkJ,GAAU9D,EAAO4E,GAAa,CAEhCoC,GAAInG,GAAsB,MAAQ/E,EAAYpB,EAE9CK,MAAOS,EAAIyL,UAAYlM,EACvBuK,SAAUA,GACV4B,QAASvG,KAAeoG,GAAqB5F,KAASzG,GAGtDyM,WAAYtG,GAAsB,MAC9BF,IAAcQ,KACdzG,IA0BN,GAvBAoJ,GAAQsD,IAAMxM,EAIVmC,IACF+G,GAAQuD,OAAStK,EAAOsK,OACxBvD,GAAQwD,OAAShL,EAAUS,EAAOuK,SAS/B1L,EAAI2L,SAAS9M,EAAK,4CAInBkK,KAAoBjJ,IACtBoI,GAAQ0D,kBAAoB9L,IAGzBgK,IAAcrK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBkC,EAAU,SAK7B,GAAlC7B,EAAiBwH,QAAQ,OACxB,aAAaxF,KAAKhC,IACnB+I,IAEDhK,EACE,mBACEiB,EACA,SACA6B,EACA,0BAON,IACIkK,GA4DAC,GA7DA3D,GAAO,GAGP4D,GAAc,WAKhB,OAFErN,EAAiBsN,UAAYxI,EAAKxB,EAAe,aAGzBhC,EAAIgM,UAAY,IACrCzI,QAAQzD,EAAkBiJ,IAC1BxF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAASzE,GAKjCkN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKjB,MAEDpG,IAAe8G,IAAiBQ,MAApC,CAEA,IAAIC,EAASlI,EAAO4E,GAAa,CAC/BI,KAAM,SACNmD,YAAaH,EAAOD,EAAKjE,GAAQoD,UAenC,GAXIrG,GAAsB,OACxBqH,EAAOE,SAAWtG,KAAKuG,OAAOpH,KAAQsE,GAAQsC,IA3gBnC,MA6gBbA,GAAW,EACXtC,GAAQtE,KAGJJ,GAAsB,UACxBqH,EAAO1C,SAAW1D,KAAKwG,IAAI,EAAG9C,GAAU+C,OAGtCP,IAAS1M,EAAIkN,WAEf7E,GAASuE,EAAQxN,EAAcE,QAE/B,IACEU,EAAIkN,WAAWC,KAAKnN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU4L,IAC3D,MAAOQ,GAEP/E,GAASuE,EAAQxN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAI+M,QACA,KAAOvL,KAAY/C,GAASyN,KAClCJ,GAAczG,MACT4G,IAAY5G,KAAQyG,IAE7B7M,GAGF2B,EAAqBY,EAAU0K,GAAajN,GAE5C,IAAI+N,GAAOhN,EAAIgN,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuBlM,EAAgBQ,IAAiB,EACxD2L,EAAShH,KAAKwG,IAChBM,GAAK3L,IAAiB,EACtB2L,GAAK1L,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO4E,KAAKiH,IACV,IAKI,EAJJjH,KAAKuG,MACF,MAAQ1L,EAAgBqM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOrK,IAEP,OADAhE,EAAKgE,IACE,IAIXjC,EAAqB,OAAQ,WAC3BgJ,GAAW+C,KACX/L,EACEM,EACA,WACM0I,GAAW+C,OAAY/C,GAAW+C,OAExC1N,KAQJ,IAgCIoO,GAqCAC,GAAUC,GArEVlB,GAAU,SAAUmB,GACtB,IAAInE,EAAO,GAIX,IACEA,EAAOmE,GAAahN,EAAuBZ,EAAI0J,UAC/C,MAAOzG,IACPhE,EAAKgE,IAGP,IAAI4K,EAAyBhP,EAAO4L,IACpC,GAAIjE,GAAWqH,GACb,IACEpE,EAAOoE,EAAuBpL,KAAK5D,EAAQ,CAAE4K,KAAMA,KAAWA,EAC9D,MAAOxG,IACPF,EAAe,OAAQE,IAK3B,IAhZiB,SAAUwG,GAC3B,IAAK,IAAIhC,KAAK8C,GAAa,CACzB,IAAIuD,EAAgBvD,GAAY9C,GAChC,GAAKqG,EAAL,CAGA,IAAIC,EAlPI,KAmPND,EAAc,GAAcA,EAnPtB,IAmP8CA,EAEtD,GACEC,IAAetE,GACf,IAAIjE,OACF,IAAM/B,EAAYsK,GAAYpK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKuH,GAEP,OAAOrK,GAEX,OAAOC,EA8XH2O,CAAavE,GAQjB,MAFY,QAARQ,IAAkBjK,EAAIiO,OAAMxE,GAAQzJ,EAAIiO,KAAK7J,MAAM,KAAK,IAErDqF,EAPLxK,EAAKuB,EAAiB,YAAciJ,IAiDpCyE,GAAW,SACbC,EACAC,EACAvH,EACAwH,IAEKA,GAAe7H,GAAWK,KAAWwH,EAAcxH,GACxD,IACIyH,EAGEC,EAJFnG,EAAW5B,GAAW6H,GAAeA,EAAc,aAEnD9K,EAAS6K,KAAgD,EAA9BA,EAAc1G,QAAQ,OAGnD0G,GADIG,EAAQH,EAAchK,MAAM,MACVoK,QACtBF,EAAc,IAAMC,EAAMxG,KAAK,MAGjC,IAAI0B,EAAOgD,GAAQ2B,GAUnB,GARK3E,GAASwC,KAAgB9G,KAE5BmD,GAAQoD,QAAUH,GAAqB5F,KAASzG,EAC5CoJ,GAAQqD,aAAexG,KAAYmD,GAAQqD,WAAahG,MAC5DR,GAAajG,GAIVuK,GAAQwC,IAAgBxC,EAA7B,CAEAwC,GAAexC,EACflB,GAAKkB,KAAOA,EAGRpE,GAAsB,OACxBkD,GAAKkG,eACHnI,KAAKwG,IAAI3L,EAA2B,aAAK,EAAGtC,EAAO6P,YAAc,IACjE,KACFnG,GAAKoG,gBACHrI,KAAKwG,IACH3L,EAAgBQ,IAAiB,EACjC9C,EAAO+P,aAAe,IACnB,MAILvJ,GAAsB,MACpBvF,EAAIsB,KAAWmH,GAAKnH,GAAYtB,EAAIsB,IAItCe,GAAUkD,GAAsB,QAClCkD,GAAKsG,aAAe1M,EAAO2M,MAC3BvG,GAAKwG,cAAgB5M,EAAOmL,QAI9B,IAII0B,EAJAC,EAAOpQ,EAAOqQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG3F,KAC/D,MAAOvG,IACPhE,EAAKgE,IAGP0K,GAAgBqB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBtH,QAAQsH,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGzH,QAAQuH,EAAKE,GAAgB3F,MAGxC,IAAI6F,EAA0BjD,GAC1BA,GAAShI,MA1vBH,KA0vBgB,GACtBlF,EACJwO,GAAWtB,IACgD,EAAvD5B,GAAmB9C,QAAQ2H,IAC3BA,GAA2BnP,EAC3Bb,EAGJkJ,GAAK+G,OACH,QAAQpN,KAAKiK,OAAkBgC,GAAeR,GAC1CtO,GACCqO,GAEP7G,EAAWD,GAAeC,EAAU,CAClC2C,KAAMhK,EACNiK,KAAMlB,GAAKkB,OAGb,IACI8F,EAnIgB,SACpBpB,EACAqB,EACA9B,EACAnG,EACAV,GAEIsH,GAAa7B,GAAY,GAAKhE,GAAQoD,QAAStM,GACnD,IAAIqQ,EAAuB,IAAVzN,EAAcmD,GAAajG,EAC5CoJ,GAAQoD,QACN+D,IAAelE,GAAqB5F,KAASzG,GAE/C,IAAIwQ,EAAcvG,GAAkBZ,GAAKkB,KACrCkG,EAAQxI,GAAeqI,EAAkBjI,GAEzCT,EAAOtC,EAAO+D,GAAM,CACtBgE,GAAIjE,GAAQoD,QACZA,QAASpD,GAAQoD,QACjBiB,YAAa8C,EACbjG,KAAMiG,EAAa,SAAWjQ,EAC9B4M,UAAWoD,GAAoB9B,EAAWtB,GAAW,KACrDuD,MAAOA,EACPzK,EAAGA,GAEH2B,SAAU/F,EAAU+F,KAOtB,OAJA4G,GAAmBrB,GACnBA,GAAWsD,EAEX1N,IACO8E,EAoGY8I,CACjBzB,EAFWA,GAAeR,KAAkBtI,GAAsB,KAIlEqI,GACAY,EACAzH,GAGEgJ,EAAsB,WACxBpP,EAA2BrB,EAC3B+I,GAASoH,EAAcnH,IAGzB,GAAK3H,EAmBHoP,SAjBA,IACMtO,GAAUiF,GAAWjF,EAAOuO,sBAC9BvO,EACGuO,qBAAqB,CAACjO,EAAcC,IACpCiO,KAAK,SAAUC,GACd1H,GAAQ2H,QAAUD,EAAkBnO,GACpCyG,GAAQ4H,WAAaF,EAAkBlO,GACvC+N,MAEDM,SAAMN,GAETA,IAEF,MAAO3C,GACP2C,OAWFO,GAAMvR,EAAOwR,QACbC,GAAeF,GAAMA,GAAIG,UAAYrR,EACrCsR,GAAM3R,EAAO4R,cACbC,GAAgB,YAIhBtG,IAAekG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB5G,GAoBAkH,IAlBrB,WACL,IAEI/G,EAFAjF,EAAMhC,UACNmO,EAAKD,GAAK9N,MAAMgO,KAAMpM,GAY1B,OAVI8B,GAAWmK,OACbhH,EAAQ,IAAIgH,MAAMnH,KAIlBG,EAAQvJ,EAAI2Q,YAAY,UAClBC,UAAUxH,GAAMpK,EAASA,GAEjCuK,EAAMjH,UAAYgC,EAClB8L,GAAI7G,GACGkH,IAMX7P,EACE0P,GACA,WACExC,GAAS,IAEX7O,GAGF2B,EACE,WACA,WACEkN,GAAS,IAEX7O,IAKA+K,IAAuB,QAARH,IAAkB,iBAAkBpL,GACrDmC,EACE,aACA,WACEkN,GAAS,IAEX7O,GAIA+K,IAAa8D,KAEjBrP,EAAOoS,YAAc,SAAUxH,EAAM5C,EAAUuB,GAC7C8F,GAAS,EAAGzE,EAAM5C,EAAUuB,IAQ9B,IAAI8I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUxH,EAAO9C,EAAUwH,IACpCA,GAAe7H,GAAWK,KAAWwH,EAAcxH,GAExD,IAAIuK,EAAkB5K,GAAWmD,GAC7BvB,EAAW5B,GAAW6H,GAAeA,EAAc,aACnDgD,SAAmB1H,EAEvB,GAAIuH,GAAWxJ,QAAQ2J,GAAa,IAAMD,EAExC,OADArO,EAAesH,GAAmB5K,EAAY,aAAe4R,GACtDjJ,IAGT,IACE,GAAIgJ,EAAiB,CACnB,IAAIE,EAAc3H,IAClB,GAAIuH,GAAWxJ,eAAe4J,GAAe,EAK3C,OAJAvO,EACEsH,GACAV,EAAQ,uBAAyB2H,GAE5BlJ,IAETuB,EAAQ2H,GAEV,MAAOrO,IAEP,OADAF,EAAesH,GAAmBpH,IAC3BmF,IAGTuB,GAAS,GAAKA,GAAOhG,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAI4N,EAAc,CAAE/H,KAAM/J,EAAWkK,MAAOA,GACxC6H,GAAa7D,IAAiB3L,EAAQ,GAGtCmD,IAAe8G,IAAiBQ,OAClC8E,EAAY7F,QAAUxM,EACtBqS,EAAY5F,WAAazM,GAG3B2H,EAAWD,GAAeC,EAAU0K,GAEhC5H,GACFxB,GACE3D,EAAO+M,EAAa,CAClBhF,GAAI5G,KACJgK,MAAOxI,IAAgBqK,GACvBpF,UACGoF,GAAa9D,KAAarI,GAAsB,KAC7CoI,GACA,KAEN5G,SAAU/F,EAAU+F,KAEtBuB,IAKFqJ,GAAmB,SAAU9H,EAAO9C,EAAUuB,GAChD+I,GAAUxH,EAAO9C,EAAUuB,IAIxBvJ,EAAOwL,MACVxL,EAAOwL,IAAqBoH,IAE9B,IAAIC,GAAY7S,EAAOwL,IAGnBsH,GAAQD,IAAaA,GAAUpK,EAAIoK,GAAUpK,EAAI,GAMrD,IAAK,IAAIqC,MAHT9K,EAAOwL,IAAqBoH,GAGVE,GACZzO,EAAQyO,GAAOhI,MACjB1F,MAAMC,QAAQyN,GAAMhI,KAChBwH,GAAUrO,MAAM,KAAM6O,GAAMhI,KAC5BwH,GAAUQ,GAAMhI,MAGxB,MAAOuD,IACPlO,EAAUkO,IAnJY,IAAU1D,GACxBoH,GAjoBkBzG,GAvN9B,CA6+BEtL,OACA,uBACA"} \ No newline at end of file diff --git a/dist/v12/light.js b/dist/v12/light.js index 74bda75..ce99a39 100644 --- a/dist/v12/light.js +++ b/dist/v12/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-05; a39c; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-06; 0ed5; SRI-version; v12) */ -!function(f,e,t,g){try{var m=undefined,n="https:",r=f.console,a="doNotTrack",h=f.navigator,d=f.location,v=d.host,i=f.document,o=h.userAgent,c="Not sending request ",y=!1,s=encodeURIComponent,p=decodeURIComponent,u=JSON.stringify,l=f.addEventListener,_="https://queue."+t,b=(i.documentElement,"language"),w=h.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,E=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),$=i.currentScript||i.querySelector('script[src*="'+t+'"]');g=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V="namespace",B=e[V]||x($,V)||"sa",C=e.strictUtm||"true"==x($,"strict-utm"),T=B+"_loaded";if(1==f[T])return g(c+"twice");f.sa_event_loaded=!0,f[T]=!0;var F,H=function(t,e,n){t=n?t:A(M,Z,t),h.brave&&!n&&(t.brave=!0),h._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||x($,"hostname"),z=L||v,J={version:"cdn_light_12",hostname:z};e.mode||x($,"mode");try{F=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){g(ee)}E&&(J.bot=!0);var M=A(J,{ua:o,https:d.protocol==n,timezone:F,collected_client_side:!0,page_id:N||R(),session_id:N||R()});if(M.sri=!0,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==v&&(M.hostname_original=v),a in h&&"1"==h[a])return g("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=v.indexOf(".")&&!/^[0-9.:]+$/.test(v)||L||g("Set hostname on "+v+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||x($,"referrer")||i.referrer||"").replace(v,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,K=function(e,t){if(0,!N||P||X()){var n=A(J,{type:"append",original_id:t?e:M.page_id});if(t||!h.sendBeacon)H(n,0,!0);else try{h.sendBeacon.bind(h)(_+"/append",u(n))}catch(r){H(n,0,!0)}}};l("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){g(ee)}return t},Y=function(e,t,n,r,a){e&&K(""+M.page_id,!0);var i=0===k?N:m;M.page_id=i||R();var o,c=z+Z.path,s=(o=t,(r||d.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||m),p=A(Z,{id:M.page_id,page_id:M.page_id,original_id:i,type:i?"append":"pageview",referrer:!t||n?G:null,query:s});return G=c,k++,p};!function(e,t,n,r){!r&&U(n)&&(r=n);var a,i;U(r);q(t)&&-1>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}}),U=function(e){return"function"==typeof e},V="namespace",B=e[V]||A(q,V)||"sa",C=e.strictUtm||"true"==A(q,"strict-utm"),T=B+"_loaded";if(1==f[T])return m(c+"twice");f.sa_event_loaded=!0,f[T]=!0;var F,H=function(t,e,n){t=n?t:I(M,Z,t),h.brave&&!n&&(t.brave=!0),h._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=g}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||A(q,"hostname"),z=L||v,J={version:"cdn_light_12",hostname:z};e.mode||A(q,"mode");try{F=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){m(ee)}E&&(J.bot=!0);var M=I(J,{ua:o,https:d.protocol==n,timezone:F,page_id:N||R(),session_id:N||R()});if(M.sri=!0,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==v&&(M.hostname_original=v),i in h&&"1"==h[i])return m("Not sending request when "+i+" is enabled. See "+j+"/dnt");-1!=v.indexOf(".")&&!/^[0-9.:]+$/.test(v)||L||m("Set hostname on "+v+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||A(q,"referrer")||a.referrer||"").replace(v,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||g,K=function(e,t){if(0,!N||P||X()){var n=I(J,{type:"append",original_id:t?e:M.page_id});if(t||!h.sendBeacon)H(n,0,!0);else try{h.sendBeacon.bind(h)(_+"/append",u(n))}catch(r){H(n,0,!0)}}};l("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){m(ee)}return t},Y=function(e,t,n,r,i){e&&K(""+M.page_id,!0);var a=0===k?N:g;M.page_id=a||R();var o,c=z+Z.path,s=(o=t,(r||d.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||g),p=I(Z,{id:M.page_id,page_id:M.page_id,original_id:a,type:a?"append":"pageview",referrer:!t||n?G:null,query:s});return G=c,k++,p};!function(e,t,n,r){!r&&U(n)&&(r=n);var i,a;U(r);x(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n collected_client_side: trueVar,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","collected_client_side","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","preparePageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","pageviewData","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n // Don't enrich an ignored server page before an allowed manual pageview.\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","uuid","Date","now","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","preparePageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","pageviewData","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/src/default.js b/src/default.js index 3801b5e..8a61943 100644 --- a/src/default.js +++ b/src/default.js @@ -152,14 +152,6 @@ // A server-created initial pageview can be enriched by this script. var pageLoadId = overwriteOptions.pageLoadId || attr(scriptElement, "page-load-id"); - if ( - typeof pageLoadId !== "string" || - !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test( - pageLoadId - ) - ) { - pageLoadId = undefinedVar; - } /** if ignoremetrics **/ // Customers can skip data points @@ -550,7 +542,6 @@ https: loc.protocol == https, timezone: timezone, - collected_client_side: trueVar, page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar), // se = sessions @@ -649,6 +640,7 @@ var sendOnLeave = function (id, push) { if (!collectDataOnLeave) return; + // Don't enrich an ignored server page before an allowed manual pageview. if (pageLoadId && !lastSendPath && !getPath()) return; var append = assign(basePayload, { diff --git a/test/unit/page-load-id.test.js b/test/unit/page-load-id.test.js index 64c1cc6..82b1f97 100644 --- a/test/unit/page-load-id.test.js +++ b/test/unit/page-load-id.test.js @@ -251,7 +251,7 @@ describe("server page-load ID", function () { ); expect(initial.get("original_id")).to.equal(pageLoadId); expect(initial.get("session_id")).to.equal(pageLoadId); - expect(initial.get("collected_client_side")).to.equal("true"); + expect(initial.has("collected_client_side")).to.equal(false); const event = requests(dom).find( (params) => params.get("type") === "event" ); @@ -288,19 +288,25 @@ describe("server page-load ID", function () { }); } + it("keeps normal collection for an absent ID", async function () { + const dom = createDOM(); + await wait(); + const initial = requests(dom)[0]; + expect(initial.get("type")).to.equal("pageview"); + expect(initial.has("original_id")).to.equal(false); + dom.window.close(); + }); + for (const invalidId of [ - undefined, "not-a-uuid", "e35432dd-4af3-70c3-90ad-5a95d8e4fb1f", ]) { - it(`keeps normal collection for ${ - invalidId || "an absent ID" - }`, async function () { + it(`leaves validation of ${invalidId} to the server`, async function () { const dom = createDOM({ settings: { pageLoadId: invalidId } }); await wait(); const initial = requests(dom)[0]; - expect(initial.get("type")).to.equal("pageview"); - expect(initial.has("original_id")).to.equal(false); + expect(initial.get("type")).to.equal("append"); + expect(initial.get("original_id")).to.equal(invalidId); dom.window.close(); }); }