From eb18c7ce053147ddadfd19b0ef3122fab60a1dff Mon Sep 17 00:00:00 2001 From: Conductor Adriaan Date: Sun, 18 Oct 2026 19:05:06 +0000 Subject: [PATCH] Set the loaded flag for custom event globals Automated events wait for window[saGlobal + "_loaded"], but the main script only set sa_event_loaded and the namespace flag. With a custom namespace or sa-global (for example ba_event), automated events never fired. Set the flag for the configured event function once it replaces the queue stub, and cover both setups in the unit tests. Rebuild the affected event-enabled distributions (+18 bytes minified, +4 to +9 bytes gzip). light.js and auto-events.js are unchanged. The rebuilt files also include the src change from #127, which had not been rebuilt into dist yet. Co-Authored-By: Claude Opus 5.5 (1M context) --- 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/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/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 +- src/default.js | 3 +++ test/unit/auto-events.test.js | 33 +++++++++++++++++++++++++++++++- 22 files changed, 74 insertions(+), 34 deletions(-) diff --git a/dist/latest/custom/app.js b/dist/latest/custom/app.js index 1f3a204..44879e5 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-15; 65b4; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-18; cd33; v12) */ -!function(v,e,n,m){var r,a,t;if(v)try{var g=undefined,y=!0,_=!1,i="true",o="https:",w="pageview",l="event",c="error",s=v.console,u="doNotTrack",b=v.navigator,f=v.location,x=f.host,p=v.document,d=b.userAgent,h="Not sending request ",E=h+"when ",O=_,M=encodeURIComponent,S=decodeURIComponent,k=JSON.stringify,A=v.addEventListener,q="https://"+e,C=p.documentElement||{},D="language",$="Height",H="scroll",R=b.userAgentData,j=H+$,L="offset"+$,N="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(d)&&!/(cubot)/i.test(d),F=v.screen,z=p.currentScript||p.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(s.warn,s,t)};var W=function(t,e){m("Error in your "+t+" function:",e)},G=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},J=function(t){return"string"==typeof t},X=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Y=function(t,e){return t&&t.getAttribute("data-"+e)},Z=function(t){return Array.isArray(t)?t:J(t)&&t.length?t.split(/, ?/):[]},K=function(t){return t&&t.constructor===Object},Q=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)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=v[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=v[qt];if(!ct(r))return qt&&m(qt+" not found, set window."+qt),t;try{return Q(t,r.call(v,Q(t,e)))}catch(a){W("metadata",a)}},ft=et.strictUtm||Y(z,"strict-utm")==i,pt=function(i,t){nt=!i&&at("q")?"":_;var e=(t||f.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&0"); +!function(v,e,n,m){var r,a,t;if(v)try{var g=undefined,y=!0,_=!1,i="true",o="https:",w="pageview",l="event",c="error",s=v.console,u="doNotTrack",b=v.navigator,f=v.location,x=f.host,d=v.document,p=b.userAgent,h="Not sending request ",E=h+"when ",O=_,M=encodeURIComponent,S=decodeURIComponent,k=JSON.stringify,A=v.addEventListener,q="https://"+e,C=d.documentElement||{},D="language",$="Height",H="scroll",R=b.userAgentData,j=H+$,L="offset"+$,N="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),F=v.screen,z=d.currentScript||d.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(s.warn,s,t)};var W=function(t,e){m("Error in your "+t+" function:",e)},G=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},J=function(t){return"string"==typeof t},X=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Y=function(t,e){return t&&t.getAttribute("data-"+e)},Z=function(t){return Array.isArray(t)?t:J(t)&&t.length?t.split(/, ?/):[]},K=function(t){return t&&t.constructor===Object},Q=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)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=v[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=v[qt];if(!ct(r))return qt&&m(qt+" not found, set window."+qt),t;try{return Q(t,r.call(v,Q(t,e)))}catch(a){W("metadata",a)}},ft=et.strictUtm||Y(z,"strict-utm")==i,dt=function(i,t){nt=!i&&at("q")?"":_;var e=(t||f.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&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 a8d8242..732d82e 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 baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\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 // 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;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n settings.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 settings[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 settings.strictUtm || 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, keepalive) {\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 var imageUrl =\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 // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.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 = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.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 settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || 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 (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n 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 var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\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 // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\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 var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\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 undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\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\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","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","logSettings","settings","sa_settings","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","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","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","raw","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","parts","querySearch","shift","pathKey","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","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"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 baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\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 // 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;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n settings.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 settings[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 settings.strictUtm || 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, keepalive) {\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 var imageUrl =\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 // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.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 = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.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 settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || 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 (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n 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 var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\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 // scre = screensizes\n if (screen && collectMetricByString(\"scre\")) {\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 // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\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 var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\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 undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\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 // Automated events wait for this variable, for example ba_event_loaded\n window[eventFunctionName + \"_loaded\"] = trueVar;\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\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","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","logSettings","settings","sa_settings","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","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","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","raw","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","parts","querySearch","shift","pathKey","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","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"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 692d04a..b526a47 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-15; 1c39; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-18; 3fc3; v12) */ -!function(v,e,n,m){var r,a,t;if(v)try{var g=undefined,y=!0,_=!1,i="true",o="https:",w="pageview",l="event",c="error",s=v.console,u="doNotTrack",b=v.navigator,f=v.location,x=f.host,d=v.document,p=b.userAgent,h="Not sending request ",E=h+"when ",O=_,M=encodeURIComponent,S=decodeURIComponent,k=JSON.stringify,A=v.addEventListener,q="https://"+e,C=d.documentElement||{},D="language",$="Height",H="scroll",R=b.userAgentData,j=H+$,L="offset"+$,N="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),F=v.screen,z=d.currentScript||d.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(s.warn,s,t)};var W=function(t,e){m("Error in your "+t+" function:",e)},G=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},J=function(t){return"string"==typeof t},X=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Y=function(t,e){return t&&t.getAttribute("data-"+e)},Z=function(t){return Array.isArray(t)?t:J(t)&&t.length?t.split(/, ?/):[]},K=function(t){return t&&t.constructor===Object},Q=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)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=v[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=v[qt];if(!ct(r))return qt&&m(qt+" not found, set window."+qt),t;try{return Q(t,r.call(v,Q(t,e)))}catch(a){W("metadata",a)}},ft=et.strictUtm||Y(z,"strict-utm")==i,dt=function(i,t){nt=!i&&at("q")?"":_;var e=(t||f.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&0"); +!function(v,e,n,m){var r,a,t;if(v)try{var g=undefined,y=!0,_=!1,i="true",o="https:",w="pageview",l="event",c="error",s=v.console,u="doNotTrack",b=v.navigator,f=v.location,x=f.host,d=v.document,p=b.userAgent,h="Not sending request ",E=h+"when ",O=_,M=encodeURIComponent,S=decodeURIComponent,k=JSON.stringify,A=v.addEventListener,q="https://"+e,C=d.documentElement||{},D="language",$="Height",H="scroll",R=b.userAgentData,j=H+$,L="offset"+$,N="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),F=v.screen,z=d.currentScript||d.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(s.warn,s,t)};var W=function(t,e){m("Error in your "+t+" function:",e)},G=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},J=function(t){return"string"==typeof t},X=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Y=function(t,e){return t&&t.getAttribute("data-"+e)},Z=function(t){return Array.isArray(t)?t:J(t)&&t.length?t.split(/, ?/):[]},K=function(t){return t&&t.constructor===Object},Q=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)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=v[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=v[qt];if(!ct(r))return qt&&m(qt+" not found, set window."+qt),t;try{return Q(t,r.call(v,Q(t,e)))}catch(a){W("metadata",a)}},ft=et.strictUtm||Y(z,"strict-utm")==i,dt=function(i,t){nt=!i&&at("q")?"":_;var e=(t||f.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&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 325699b..b6d84bf 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 baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\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 // 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;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n settings.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 settings[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 settings.strictUtm || 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, keepalive) {\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 var imageUrl =\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 // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.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 = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.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 settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || 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 (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n 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 var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\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 // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\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 var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\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 undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\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\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","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","logSettings","settings","sa_settings","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","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","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","raw","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","parts","querySearch","shift","pathKey","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","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"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 baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\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 // 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;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n settings.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 settings[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 settings.strictUtm || 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, keepalive) {\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 var imageUrl =\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 // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.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 = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.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 settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || 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 (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n 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 var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\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 // scre = screensizes\n if (screen && collectMetricByString(\"scre\")) {\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 // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\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 var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\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 undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\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 // Automated events wait for this variable, for example ba_event_loaded\n window[eventFunctionName + \"_loaded\"] = trueVar;\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\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","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","logSettings","settings","sa_settings","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","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","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","raw","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","parts","querySearch","shift","pathKey","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","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"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 579c9a8..e1d883b 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-15; 5f47; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-18; 306e; v12) */ /* eslint-env browser */ (function ( @@ -765,8 +765,8 @@ if (nav[language]) page[language] = nav[language]; } - // sc = screensizes - if (screen && collectMetricByString("sc")) { + // scre = screensizes + if (screen && collectMetricByString("scre")) { page.screen_width = screen.width; page.screen_height = screen.height; } @@ -997,6 +997,9 @@ // Overwrite user defined function window[eventFunctionName] = defaultEventFunc; + // Automated events wait for this variable, for example ba_event_loaded + window[eventFunctionName + "_loaded"] = trueVar; + // Post events from the queue of the user defined function for (var event in queue) { if (hasProp(queue, event)) { diff --git a/dist/latest/custom/latest.js b/dist/latest/custom/latest.js index 186abf9..e440527 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-15; 79e7; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-18; 654f; v12) */ -!function(v,e,n,m){var r,a,t;if(v)try{var g=undefined,y=!0,_=!1,i="true",o="https:",w="pageview",l="event",c="error",s=v.console,u="doNotTrack",b=v.navigator,f=v.location,x=f.host,d=v.document,p=b.userAgent,h="Not sending request ",E=h+"when ",O=_,M=encodeURIComponent,S=decodeURIComponent,k=JSON.stringify,A=v.addEventListener,q="https://"+e,C=d.documentElement||{},D="language",$="Height",H="scroll",R=b.userAgentData,j=H+$,L="offset"+$,N="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),F=v.screen,z=d.currentScript||d.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(s.warn,s,t)};var W=function(t,e){m("Error in your "+t+" function:",e)},G=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},J=function(t){return"string"==typeof t},X=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Y=function(t,e){return t&&t.getAttribute("data-"+e)},Z=function(t){return Array.isArray(t)?t:J(t)&&t.length?t.split(/, ?/):[]},K=function(t){return t&&t.constructor===Object},Q=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)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=v[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=v[qt];if(!ct(r))return qt&&m(qt+" not found, set window."+qt),t;try{return Q(t,r.call(v,Q(t,e)))}catch(a){W("metadata",a)}},ft=et.strictUtm||Y(z,"strict-utm")==i,dt=function(i,t){nt=!i&&at("q")?"":_;var e=(t||f.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&0"); +!function(v,e,n,m){var r,a,t;if(v)try{var g=undefined,y=!0,_=!1,i="true",o="https:",w="pageview",l="event",c="error",s=v.console,u="doNotTrack",b=v.navigator,f=v.location,x=f.host,d=v.document,p=b.userAgent,h="Not sending request ",E=h+"when ",O=_,M=encodeURIComponent,S=decodeURIComponent,k=JSON.stringify,A=v.addEventListener,q="https://"+e,C=d.documentElement||{},D="language",$="Height",H="scroll",R=b.userAgentData,j=H+$,L="offset"+$,N="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),F=v.screen,z=d.currentScript||d.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(s.warn,s,t)};var W=function(t,e){m("Error in your "+t+" function:",e)},G=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},J=function(t){return"string"==typeof t},X=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Y=function(t,e){return t&&t.getAttribute("data-"+e)},Z=function(t){return Array.isArray(t)?t:J(t)&&t.length?t.split(/, ?/):[]},K=function(t){return t&&t.constructor===Object},Q=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)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=v[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=v[qt];if(!ct(r))return qt&&m(qt+" not found, set window."+qt),t;try{return Q(t,r.call(v,Q(t,e)))}catch(a){W("metadata",a)}},ft=et.strictUtm||Y(z,"strict-utm")==i,dt=function(i,t){nt=!i&&at("q")?"":_;var e=(t||f.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&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 e8fd11c..4e8517c 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 baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\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 // 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;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n settings.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 settings[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 settings.strictUtm || 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, keepalive) {\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 var imageUrl =\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 // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.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 = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.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 settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || 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 (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n 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 var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\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 // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\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 var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\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 undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\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\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","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","logSettings","settings","sa_settings","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","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","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","raw","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","parts","querySearch","shift","pathKey","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","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"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 baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\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 // 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;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n settings.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 settings[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 settings.strictUtm || 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, keepalive) {\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 var imageUrl =\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 // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.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 = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.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 settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || 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 (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n 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 var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\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 // scre = screensizes\n if (screen && collectMetricByString(\"scre\")) {\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 // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\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 var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\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 undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\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 // Automated events wait for this variable, for example ba_event_loaded\n window[eventFunctionName + \"_loaded\"] = trueVar;\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\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","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","logSettings","settings","sa_settings","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","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","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","raw","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","parts","querySearch","shift","pathKey","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","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"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 b88a2a7..eb2c037 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-15; 8624; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-18; 5383; v12) */ -!function(v,e,n,m){var r,a,t;if(v)try{var g=undefined,y=!0,_=!1,i="true",o="https:",w="pageview",l="event",c="error",s=v.console,u="doNotTrack",b=v.navigator,f=v.location,x=f.host,p=v.document,d=b.userAgent,h="Not sending request ",E=h+"when ",O=_,M=encodeURIComponent,S=decodeURIComponent,k=JSON.stringify,A=v.addEventListener,q="https://"+e,C=p.documentElement||{},D="language",$="Height",H="scroll",R=b.userAgentData,j=H+$,L="offset"+$,N="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(d)&&!/(cubot)/i.test(d),F=v.screen,z=p.currentScript||p.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(s.warn,s,t)};var W=function(t,e){m("Error in your "+t+" function:",e)},G=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},J=function(t){return"string"==typeof t},X=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Y=function(t,e){return t&&t.getAttribute("data-"+e)},Z=function(t){return Array.isArray(t)?t:J(t)&&t.length?t.split(/, ?/):[]},K=function(t){return t&&t.constructor===Object},Q=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)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=v[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=v[qt];if(!ct(r))return qt&&m(qt+" not found, set window."+qt),t;try{return Q(t,r.call(v,Q(t,e)))}catch(a){W("metadata",a)}},ft=et.strictUtm||Y(z,"strict-utm")==i,pt=function(i,t){nt=!i&&at("q")?"":_;var e=(t||f.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&0"); +!function(v,e,n,m){var r,a,t;if(v)try{var g=undefined,y=!0,_=!1,i="true",o="https:",w="pageview",l="event",c="error",s=v.console,u="doNotTrack",b=v.navigator,f=v.location,x=f.host,d=v.document,p=b.userAgent,h="Not sending request ",E=h+"when ",O=_,M=encodeURIComponent,S=decodeURIComponent,k=JSON.stringify,A=v.addEventListener,q="https://"+e,C=d.documentElement||{},D="language",$="Height",H="scroll",R=b.userAgentData,j=H+$,L="offset"+$,N="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),F=v.screen,z=d.currentScript||d.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(s.warn,s,t)};var W=function(t,e){m("Error in your "+t+" function:",e)},G=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},J=function(t){return"string"==typeof t},X=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Y=function(t,e){return t&&t.getAttribute("data-"+e)},Z=function(t){return Array.isArray(t)?t:J(t)&&t.length?t.split(/, ?/):[]},K=function(t){return t&&t.constructor===Object},Q=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)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=v[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=v[qt];if(!ct(r))return qt&&m(qt+" not found, set window."+qt),t;try{return Q(t,r.call(v,Q(t,e)))}catch(a){W("metadata",a)}},ft=et.strictUtm||Y(z,"strict-utm")==i,dt=function(i,t){nt=!i&&at("q")?"":_;var e=(t||f.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&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 0778ab9..788def3 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 baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\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 // 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;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n settings.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 settings[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 settings.strictUtm || 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, keepalive) {\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 var imageUrl =\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 // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.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 = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.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 settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || 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 (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n 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 var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\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 // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\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 var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\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 undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\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\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","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","logSettings","settings","sa_settings","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","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","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","raw","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","parts","querySearch","shift","pathKey","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","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"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 baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\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 // 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;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n settings.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 settings[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 settings.strictUtm || 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, keepalive) {\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 var imageUrl =\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 // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.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 = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.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 settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || 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 (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n 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 var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\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 // scre = screensizes\n if (screen && collectMetricByString(\"scre\")) {\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 // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\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 var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\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 undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\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 // Automated events wait for this variable, for example ba_event_loaded\n window[eventFunctionName + \"_loaded\"] = trueVar;\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\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","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","logSettings","settings","sa_settings","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","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","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","raw","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","parts","querySearch","shift","pathKey","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","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/hello.js b/dist/latest/hello.js index 05857b8..69c93c2 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-15; 9ce0) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-18; 9995) */ -!function(m,e,n,v){var r,a,t;if(m)try{var g=undefined,y=!0,_=!1,i="true",o="https:",w="pageview",l="event",c="error",s=m.console,u="doNotTrack",b=m.navigator,f=m.location,E=f.host,d=m.document,p=b.userAgent,h="Not sending request ",x=h+"when ",O=_,M=encodeURIComponent,S=decodeURIComponent,k=JSON.stringify,q=m.addEventListener,A="https://queue."+e,C=d.documentElement||{},D="language",$="Height",R="scroll",j=b.userAgentData,H=R+$,L="offset"+$,N="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),F=m.screen,z=d.currentScript||d.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(s.warn,s,t)};var W=function(t,e){v("Error in your "+t+" function:",e)},G=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},J=function(t){return"string"==typeof t},X=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Y=function(t,e){return t&&t.getAttribute("data-"+e)},Z=function(t){return Array.isArray(t)?t:J(t)&&t.length?t.split(/, ?/):[]},K=function(t){return t&&t.constructor===Object},Q=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)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=m[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=m[At];if(!ct(r))return At&&v(At+" not found, set window."+At),t;try{return Q(t,r.call(m,Q(t,e)))}catch(a){W("metadata",a)}},ft=et.strictUtm||Y(z,"strict-utm")==i,dt=function(i,t){nt=!i&&at("q")?"":_;var e=(t||f.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&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)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=m[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=m[At];if(!ct(r))return At&&v(At+" not found, set window."+At),t;try{return Q(t,r.call(m,Q(t,e)))}catch(a){W("metadata",a)}},dt=et.strictUtm||Y(z,"strict-utm")==i,ft=function(i,t){nt=!i&&at("q")?"":_;var e=(t||d.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&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 settings[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 settings.strictUtm || 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, keepalive) {\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 var imageUrl =\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 // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.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 = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.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 settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || 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 (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n 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 var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\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 // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\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 var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\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 undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\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\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","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","logSettings","settings","sa_settings","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","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","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","raw","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","parts","querySearch","shift","pathKey","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","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"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 baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\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 // 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;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n settings.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 settings[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 settings.strictUtm || 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, keepalive) {\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 var imageUrl =\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 // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.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 = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.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 settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || 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 (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n 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 var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\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 // scre = screensizes\n if (screen && collectMetricByString(\"scre\")) {\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 // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\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 var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\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 undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\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 // Automated events wait for this variable, for example ba_event_loaded\n window[eventFunctionName + \"_loaded\"] = trueVar;\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\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","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","logSettings","settings","sa_settings","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","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","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","raw","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","parts","querySearch","shift","pathKey","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","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"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 4568881..c84c8e3 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-15; 1a59; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-18; 40d9; v12) */ /* eslint-env browser */ (function ( @@ -765,8 +765,8 @@ if (nav[language]) page[language] = nav[language]; } - // sc = screensizes - if (screen && collectMetricByString("sc")) { + // scre = screensizes + if (screen && collectMetricByString("scre")) { page.screen_width = screen.width; page.screen_height = screen.height; } @@ -997,6 +997,9 @@ // Overwrite user defined function window[eventFunctionName] = defaultEventFunc; + // Automated events wait for this variable, for example ba_event_loaded + window[eventFunctionName + "_loaded"] = trueVar; + // Post events from the queue of the user defined function for (var event in queue) { if (hasProp(queue, event)) { diff --git a/dist/latest/latest.js b/dist/latest/latest.js index e05ca67..5e48fc9 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-15; d320; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-18; 88af; v12) */ -!function(m,e,n,v){var r,a,t;if(m)try{var g=undefined,y=!0,_=!1,i="true",o="https:",w="pageview",l="event",c="error",s=m.console,u="doNotTrack",b=m.navigator,f=m.location,E=f.host,d=m.document,p=b.userAgent,h="Not sending request ",x=h+"when ",O=_,M=encodeURIComponent,S=decodeURIComponent,k=JSON.stringify,q=m.addEventListener,A="https://queue."+e,C=d.documentElement||{},D="language",$="Height",R="scroll",j=b.userAgentData,H=R+$,L="offset"+$,N="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),F=m.screen,z=d.currentScript||d.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(s.warn,s,t)};var W=function(t,e){v("Error in your "+t+" function:",e)},G=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},J=function(t){return"string"==typeof t},X=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Y=function(t,e){return t&&t.getAttribute("data-"+e)},Z=function(t){return Array.isArray(t)?t:J(t)&&t.length?t.split(/, ?/):[]},K=function(t){return t&&t.constructor===Object},Q=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)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=m[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=m[At];if(!ct(r))return At&&v(At+" not found, set window."+At),t;try{return Q(t,r.call(m,Q(t,e)))}catch(a){W("metadata",a)}},ft=et.strictUtm||Y(z,"strict-utm")==i,dt=function(i,t){nt=!i&&at("q")?"":_;var e=(t||f.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&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)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=m[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=m[At];if(!ct(r))return At&&v(At+" not found, set window."+At),t;try{return Q(t,r.call(m,Q(t,e)))}catch(a){W("metadata",a)}},dt=et.strictUtm||Y(z,"strict-utm")==i,ft=function(i,t){nt=!i&&at("q")?"":_;var e=(t||d.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&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 settings[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 settings.strictUtm || 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, keepalive) {\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 var imageUrl =\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 // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.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 = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.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 settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || 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 (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n 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 var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\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 // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\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 var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\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 undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\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\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","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","logSettings","settings","sa_settings","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","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","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","raw","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","parts","querySearch","shift","pathKey","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","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"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 baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\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 // 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;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n settings.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 settings[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 settings.strictUtm || 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, keepalive) {\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 var imageUrl =\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 // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.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 = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.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 settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || 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 (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n 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 var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\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 // scre = screensizes\n if (screen && collectMetricByString(\"scre\")) {\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 // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\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 var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\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 undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\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 // Automated events wait for this variable, for example ba_event_loaded\n window[eventFunctionName + \"_loaded\"] = trueVar;\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\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","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","logSettings","settings","sa_settings","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","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","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","raw","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","parts","querySearch","shift","pathKey","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","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/app.js b/dist/v12/app.js index 472fa43..a6565d5 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-15; 2ba7; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-18; a423; SRI-version; v12) */ -!function(m,e,n,v){var r,a,t;if(m)try{var g=undefined,y=!0,_=!1,i="true",o="https:",w="pageview",l="event",c="error",s=m.console,u="doNotTrack",b=m.navigator,f=m.location,E=f.host,d=m.document,p=b.userAgent,h="Not sending request ",x=h+"when ",O=_,M=encodeURIComponent,S=decodeURIComponent,k=JSON.stringify,q=m.addEventListener,A="https://queue."+e,C=d.documentElement||{},D="language",$="Height",R="scroll",j=b.userAgentData,H=R+$,L="offset"+$,N="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),F=m.screen,z=d.currentScript||d.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(s.warn,s,t)};var W=function(t,e){v("Error in your "+t+" function:",e)},G=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},J=function(t){return"string"==typeof t},X=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Y=function(t,e){return t&&t.getAttribute("data-"+e)},Z=function(t){return Array.isArray(t)?t:J(t)&&t.length?t.split(/, ?/):[]},K=function(t){return t&&t.constructor===Object},Q=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)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=m[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=m[At];if(!ct(r))return At&&v(At+" not found, set window."+At),t;try{return Q(t,r.call(m,Q(t,e)))}catch(a){W("metadata",a)}},ft=et.strictUtm||Y(z,"strict-utm")==i,dt=function(i,t){nt=!i&&at("q")?"":_;var e=(t||f.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&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)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=m[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=m[At];if(!ct(r))return At&&v(At+" not found, set window."+At),t;try{return Q(t,r.call(m,Q(t,e)))}catch(a){W("metadata",a)}},dt=et.strictUtm||Y(z,"strict-utm")==i,ft=function(i,t){nt=!i&&at("q")?"":_;var e=(t||d.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&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 settings[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 settings.strictUtm || 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, keepalive) {\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 var imageUrl =\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 // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.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 = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.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 settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || 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 (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n 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 var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\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 // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\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 var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\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 undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\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\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","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","logSettings","settings","sa_settings","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","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","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","raw","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","parts","querySearch","shift","pathKey","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","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"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 baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\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 // 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;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n settings.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 settings[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 settings.strictUtm || 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, keepalive) {\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 var imageUrl =\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 // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.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 = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.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 settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || 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 (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n 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 var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\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 // scre = screensizes\n if (screen && collectMetricByString(\"scre\")) {\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 // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\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 var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\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 undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\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 // Automated events wait for this variable, for example ba_event_loaded\n window[eventFunctionName + \"_loaded\"] = trueVar;\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\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","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","logSettings","settings","sa_settings","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","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","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","raw","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","parts","querySearch","shift","pathKey","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","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"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 e61330e..3b66579 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-15; fcc2; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-18; aa25; SRI-version; v12) */ -!function(v,e,n,m){var r,a,t;if(v)try{var g=undefined,y=!0,_=!1,i="true",o="https:",w="pageview",l="event",c="error",s=v.console,u="doNotTrack",b=v.navigator,f=v.location,x=f.host,p=v.document,d=b.userAgent,h="Not sending request ",E=h+"when ",O=_,M=encodeURIComponent,S=decodeURIComponent,k=JSON.stringify,A=v.addEventListener,q="https://"+e,C=p.documentElement||{},D="language",$="Height",H="scroll",R=b.userAgentData,j=H+$,L="offset"+$,N="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(d)&&!/(cubot)/i.test(d),F=v.screen,z=p.currentScript||p.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(s.warn,s,t)};var W=function(t,e){m("Error in your "+t+" function:",e)},G=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},J=function(t){return"string"==typeof t},X=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Y=function(t,e){return t&&t.getAttribute("data-"+e)},Z=function(t){return Array.isArray(t)?t:J(t)&&t.length?t.split(/, ?/):[]},K=function(t){return t&&t.constructor===Object},Q=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)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=v[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=v[qt];if(!ct(r))return qt&&m(qt+" not found, set window."+qt),t;try{return Q(t,r.call(v,Q(t,e)))}catch(a){W("metadata",a)}},ft=et.strictUtm||Y(z,"strict-utm")==i,pt=function(i,t){nt=!i&&at("q")?"":_;var e=(t||f.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&0"); +!function(v,e,n,m){var r,a,t;if(v)try{var g=undefined,y=!0,_=!1,i="true",o="https:",w="pageview",l="event",c="error",s=v.console,u="doNotTrack",b=v.navigator,f=v.location,x=f.host,d=v.document,p=b.userAgent,h="Not sending request ",E=h+"when ",O=_,M=encodeURIComponent,S=decodeURIComponent,k=JSON.stringify,A=v.addEventListener,q="https://"+e,C=d.documentElement||{},D="language",$="Height",H="scroll",R=b.userAgentData,j=H+$,L="offset"+$,N="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),F=v.screen,z=d.currentScript||d.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(s.warn,s,t)};var W=function(t,e){m("Error in your "+t+" function:",e)},G=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},J=function(t){return"string"==typeof t},X=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Y=function(t,e){return t&&t.getAttribute("data-"+e)},Z=function(t){return Array.isArray(t)?t:J(t)&&t.length?t.split(/, ?/):[]},K=function(t){return t&&t.constructor===Object},Q=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)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=v[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=v[qt];if(!ct(r))return qt&&m(qt+" not found, set window."+qt),t;try{return Q(t,r.call(v,Q(t,e)))}catch(a){W("metadata",a)}},ft=et.strictUtm||Y(z,"strict-utm")==i,dt=function(i,t){nt=!i&&at("q")?"":_;var e=(t||f.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&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 c2da3ef..dff565f 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 baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\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 // 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;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n settings.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 settings[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 settings.strictUtm || 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, keepalive) {\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 var imageUrl =\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 // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.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 = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.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 settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || 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 (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n 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 var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\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 // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\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 var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\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 undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\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\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","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","logSettings","settings","sa_settings","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","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","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","raw","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","parts","querySearch","shift","pathKey","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","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"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 baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\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 // 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;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n settings.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 settings[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 settings.strictUtm || 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, keepalive) {\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 var imageUrl =\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 // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.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 = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.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 settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || 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 (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n 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 var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\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 // scre = screensizes\n if (screen && collectMetricByString(\"scre\")) {\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 // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\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 var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\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 undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\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 // Automated events wait for this variable, for example ba_event_loaded\n window[eventFunctionName + \"_loaded\"] = trueVar;\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\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","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","logSettings","settings","sa_settings","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","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","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","raw","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","parts","querySearch","shift","pathKey","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","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"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 5cab442..b194028 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-15; a36f; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-18; a1b1; SRI-version; v12) */ -!function(v,e,n,m){var r,a,t;if(v)try{var g=undefined,y=!0,_=!1,i="true",o="https:",w="pageview",l="event",c="error",s=v.console,u="doNotTrack",b=v.navigator,f=v.location,x=f.host,p=v.document,d=b.userAgent,h="Not sending request ",E=h+"when ",O=_,M=encodeURIComponent,S=decodeURIComponent,k=JSON.stringify,A=v.addEventListener,q="https://"+e,C=p.documentElement||{},D="language",$="Height",H="scroll",R=b.userAgentData,j=H+$,L="offset"+$,N="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(d)&&!/(cubot)/i.test(d),F=v.screen,z=p.currentScript||p.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(s.warn,s,t)};var W=function(t,e){m("Error in your "+t+" function:",e)},G=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},J=function(t){return"string"==typeof t},X=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Y=function(t,e){return t&&t.getAttribute("data-"+e)},Z=function(t){return Array.isArray(t)?t:J(t)&&t.length?t.split(/, ?/):[]},K=function(t){return t&&t.constructor===Object},Q=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)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=v[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=v[qt];if(!ct(r))return qt&&m(qt+" not found, set window."+qt),t;try{return Q(t,r.call(v,Q(t,e)))}catch(a){W("metadata",a)}},ft=et.strictUtm||Y(z,"strict-utm")==i,pt=function(i,t){nt=!i&&at("q")?"":_;var e=(t||f.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&0"); +!function(v,e,n,m){var r,a,t;if(v)try{var g=undefined,y=!0,_=!1,i="true",o="https:",w="pageview",l="event",c="error",s=v.console,u="doNotTrack",b=v.navigator,f=v.location,x=f.host,d=v.document,p=b.userAgent,h="Not sending request ",E=h+"when ",O=_,M=encodeURIComponent,S=decodeURIComponent,k=JSON.stringify,A=v.addEventListener,q="https://"+e,C=d.documentElement||{},D="language",$="Height",H="scroll",R=b.userAgentData,j=H+$,L="offset"+$,N="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),F=v.screen,z=d.currentScript||d.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(s.warn,s,t)};var W=function(t,e){m("Error in your "+t+" function:",e)},G=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},J=function(t){return"string"==typeof t},X=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Y=function(t,e){return t&&t.getAttribute("data-"+e)},Z=function(t){return Array.isArray(t)?t:J(t)&&t.length?t.split(/, ?/):[]},K=function(t){return t&&t.constructor===Object},Q=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)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=v[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=v[qt];if(!ct(r))return qt&&m(qt+" not found, set window."+qt),t;try{return Q(t,r.call(v,Q(t,e)))}catch(a){W("metadata",a)}},ft=et.strictUtm||Y(z,"strict-utm")==i,dt=function(i,t){nt=!i&&at("q")?"":_;var e=(t||f.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&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 db13d56..3c34190 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 baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\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 // 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;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n settings.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 settings[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 settings.strictUtm || 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, keepalive) {\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 var imageUrl =\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 // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.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 = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.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 settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || 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 (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n 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 var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\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 // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\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 var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\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 undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\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\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","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","logSettings","settings","sa_settings","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","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","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","raw","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","parts","querySearch","shift","pathKey","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","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"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 baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\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 // 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;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n settings.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 settings[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 settings.strictUtm || 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, keepalive) {\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 var imageUrl =\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 // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.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 = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.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 settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || 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 (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n 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 var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\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 // scre = screensizes\n if (screen && collectMetricByString(\"scre\")) {\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 // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\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 var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\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 undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\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 // Automated events wait for this variable, for example ba_event_loaded\n window[eventFunctionName + \"_loaded\"] = trueVar;\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\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","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","logSettings","settings","sa_settings","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","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","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","raw","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","parts","querySearch","shift","pathKey","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","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/src/default.js b/src/default.js index c580a8b..41ecf1c 100644 --- a/src/default.js +++ b/src/default.js @@ -1131,6 +1131,9 @@ // Overwrite user defined function window[eventFunctionName] = defaultEventFunc; + // Automated events wait for this variable, for example ba_event_loaded + window[eventFunctionName + "_loaded"] = trueVar; + // Post events from the queue of the user defined function for (var event in queue) { if (hasProp(queue, event)) { diff --git a/test/unit/auto-events.test.js b/test/unit/auto-events.test.js index 0a3492e..1c8256f 100644 --- a/test/unit/auto-events.test.js +++ b/test/unit/auto-events.test.js @@ -1,7 +1,8 @@ const { expect } = require("chai"); const { createDOM } = require("./helpers/dom-auto-events"); +const { createDOM: createTrackerDOM } = require("./helpers/dom"); const { readFileSync } = require("fs"); -const { runInNewContext } = require("vm"); +const { runInContext, runInNewContext } = require("vm"); function setupDOM() { const events = []; @@ -84,6 +85,36 @@ describe("auto-events", function () { expect(navigations).to.deep.equal([]); }); + for (const [settings, saGlobal] of [ + [{ namespace: "ba" }, "ba_event"], + [{ saGlobal: "my_event" }, "my_event"], + ]) { + it(`sends events through the ${saGlobal} tracker function`, function () { + const dom = createTrackerDOM({ + settings: { autoCollect: false, ...settings }, + }); + const script = dom.window.document.createElement("script"); + script.src = "auto-events.js"; + script.setAttribute("data-sa-global", saGlobal); + dom.window.document.head.appendChild(script); + runInContext( + readFileSync("dist/latest/auto-events.js", "utf8"), + dom.getInternalVMContext() + ); + const link = dom.window.document.createElement("a"); + link.href = "https://example.org/path"; + + dom.window.saAutomatedLink(link, "outbound"); + + expect( + dom.sent.map((request) => + new URL(request.url).searchParams.get("event") + ) + ).to.deep.equal(["outbound_example_org"]); + dom.window.close(); + }); + } + it("tracks outbound link clicks", function (done) { const dom = setupDOM(); const link = dom.window.document.createElement("a");