{ "version": 3, "file": "array.js", "sources": [ "../src/lz-string.ts", "../src/config.ts", "../src/utils.ts", "../src/autocapture-utils.ts", "../src/extensions/rageclick.ts", "../src/autocapture.ts", "../src/storage.ts", "../src/gdpr-utils.ts", "../src/posthog-people.ts", "../src/posthog-featureflags.ts", "../src/posthog-persistence.ts", "../src/extensions/sessionrecording-utils.ts", "../src/extensions/sessionrecording.ts", "../src/extensions/web-performance.ts", "../src/decide.ts", "../src/extensions/cloud.ts", "../src/extensions/toolbar.ts", "../src/base-request-queue.ts", "../src/request-queue.ts", "../src/capture-metrics.ts", "../node_modules/fflate/esm/browser.js", "../src/types.ts", "../src/send-request.ts", "../src/posthog-core.ts", "../src/retry-queue.ts", "../src/sessionid.ts", "../src/extensions/sentry-integration.ts", "../src/extensions/segment-integration.ts", "../src/page-view-id.ts", "../src/compression.ts" ], "sourcesContent": [ "// Copyright (c) 2013 Pieroxy \n// This work is free. You can redistribute it and/or modify it\n// under the terms of the WTFPL, Version 2\n// For more information see LICENSE.txt or http://www.wtfpl.net/\n//\n// For more information, the home page:\n// http://pieroxy.net/blog/pages/lz-string/testing.html\n//\n// LZ-based compression algorithm, version 1.4.4\n\n// private property\nconst f = String.fromCharCode\nconst keyStrBase64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='\nconst keyStrUriSafe = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$'\nconst baseReverseDic: Record> = {}\n\nfunction getBaseValue(alphabet: string, character: string) {\n if (!baseReverseDic[alphabet]) {\n baseReverseDic[alphabet] = {}\n for (let i = 0; i < alphabet.length; i++) {\n baseReverseDic[alphabet][alphabet.charAt(i)] = i\n }\n }\n return baseReverseDic[alphabet][character]\n}\n\nexport const LZString = {\n compressToBase64: function (input: null | string) {\n if (input == null) return ''\n const res = LZString._compress(input, 6, function (a) {\n return keyStrBase64.charAt(a)\n })\n switch (\n res.length % 4 // To produce valid Base64\n ) {\n default: // When could this happen ?\n case 0:\n return res\n case 1:\n return res + '==='\n case 2:\n return res + '=='\n case 3:\n return res + '='\n }\n },\n\n decompressFromBase64: function (input: string | null): string | null {\n if (input == null) return ''\n if (input == '') return null\n return LZString._decompress(input.length, 32, function (index) {\n return getBaseValue(keyStrBase64, input.charAt(index))\n })\n },\n\n compressToUTF16: function (input: string | null): string | null {\n if (input == null) return ''\n return (\n LZString._compress(input, 15, function (a) {\n return f(a + 32)\n }) + ' '\n )\n },\n\n decompressFromUTF16: function (compressed: string | null): string | null {\n if (compressed == null) return ''\n if (compressed == '') return null\n return LZString._decompress(compressed.length, 16384, function (index) {\n return compressed.charCodeAt(index) - 32\n })\n },\n\n //compress into uint8array (UCS-2 big endian format)\n compressToUint8Array: function (uncompressed: string | null): Uint8Array {\n const compressed = LZString.compress(uncompressed)\n const buf = new Uint8Array(compressed.length * 2) // 2 bytes per character\n\n for (let i = 0, TotalLen = compressed.length; i < TotalLen; i++) {\n const current_value = compressed.charCodeAt(i)\n buf[i * 2] = current_value >>> 8\n buf[i * 2 + 1] = current_value % 256\n }\n return buf\n },\n\n //decompress from uint8array (UCS-2 big endian format)\n decompressFromUint8Array: function (compressed: Uint8Array): string | null {\n if (compressed === null || compressed === undefined) {\n return LZString.decompress(compressed)\n } else {\n const buf = new Array(compressed.length / 2) // 2 bytes per character\n for (let i = 0, TotalLen = buf.length; i < TotalLen; i++) {\n buf[i] = compressed[i * 2] * 256 + compressed[i * 2 + 1]\n }\n\n const result: string[] = []\n buf.forEach(function (c) {\n result.push(f(c))\n })\n return LZString.decompress(result.join(''))\n }\n },\n\n //compress into a string that is already URI encoded\n compressToEncodedURIComponent: function (input: string | null): string | null {\n if (input == null) return ''\n return LZString._compress(input, 6, function (a) {\n return keyStrUriSafe.charAt(a)\n })\n },\n\n //decompress from an output of compressToEncodedURIComponent\n decompressFromEncodedURIComponent: function (input: string | null): string | null {\n if (input == null) return ''\n if (input == '') return null\n input = input.replace(/ /g, '+')\n return LZString._decompress(input.length, 32, function (index) {\n return getBaseValue(keyStrUriSafe, (input as string).charAt(index))\n })\n },\n\n compress: function (uncompressed: string | null): string {\n return LZString._compress(uncompressed, 16, function (a) {\n return f(a)\n })\n },\n _compress: function (\n uncompressed: string | null,\n bitsPerChar: number,\n getCharFromInt: (number: number) => string\n ): string {\n if (uncompressed == null) return ''\n let i,\n value,\n context_c = '',\n context_wc = '',\n context_w = '',\n context_enlargeIn = 2, // Compensate for the first entry which should not count\n context_dictSize = 3,\n context_numBits = 2,\n context_data_val = 0,\n context_data_position = 0,\n ii\n const context_dictionary: Record = {},\n context_dictionaryToCreate: Record = {},\n context_data = []\n\n for (ii = 0; ii < uncompressed.length; ii += 1) {\n context_c = uncompressed.charAt(ii)\n if (!Object.prototype.hasOwnProperty.call(context_dictionary, context_c)) {\n context_dictionary[context_c] = context_dictSize++\n context_dictionaryToCreate[context_c] = true\n }\n\n context_wc = context_w + context_c\n if (Object.prototype.hasOwnProperty.call(context_dictionary, context_wc)) {\n context_w = context_wc\n } else {\n if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate, context_w)) {\n if (context_w.charCodeAt(0) < 256) {\n for (i = 0; i < context_numBits; i++) {\n context_data_val = context_data_val << 1\n if (context_data_position == bitsPerChar - 1) {\n context_data_position = 0\n context_data.push(getCharFromInt(context_data_val))\n context_data_val = 0\n } else {\n context_data_position++\n }\n }\n value = context_w.charCodeAt(0)\n for (i = 0; i < 8; i++) {\n context_data_val = (context_data_val << 1) | (value & 1)\n if (context_data_position == bitsPerChar - 1) {\n context_data_position = 0\n context_data.push(getCharFromInt(context_data_val))\n context_data_val = 0\n } else {\n context_data_position++\n }\n value = value >> 1\n }\n } else {\n value = 1\n for (i = 0; i < context_numBits; i++) {\n context_data_val = (context_data_val << 1) | value\n if (context_data_position == bitsPerChar - 1) {\n context_data_position = 0\n context_data.push(getCharFromInt(context_data_val))\n context_data_val = 0\n } else {\n context_data_position++\n }\n value = 0\n }\n value = context_w.charCodeAt(0)\n for (i = 0; i < 16; i++) {\n context_data_val = (context_data_val << 1) | (value & 1)\n if (context_data_position == bitsPerChar - 1) {\n context_data_position = 0\n context_data.push(getCharFromInt(context_data_val))\n context_data_val = 0\n } else {\n context_data_position++\n }\n value = value >> 1\n }\n }\n context_enlargeIn--\n if (context_enlargeIn == 0) {\n context_enlargeIn = Math.pow(2, context_numBits)\n context_numBits++\n }\n delete context_dictionaryToCreate[context_w]\n } else {\n value = context_dictionary[context_w]\n for (i = 0; i < context_numBits; i++) {\n context_data_val = (context_data_val << 1) | (value & 1)\n if (context_data_position == bitsPerChar - 1) {\n context_data_position = 0\n context_data.push(getCharFromInt(context_data_val))\n context_data_val = 0\n } else {\n context_data_position++\n }\n value = value >> 1\n }\n }\n context_enlargeIn--\n if (context_enlargeIn == 0) {\n context_enlargeIn = Math.pow(2, context_numBits)\n context_numBits++\n }\n // Add wc to the dictionary.\n context_dictionary[context_wc] = context_dictSize++\n context_w = String(context_c)\n }\n }\n\n // Output the code for w.\n if (context_w !== '') {\n if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate, context_w)) {\n if (context_w.charCodeAt(0) < 256) {\n for (i = 0; i < context_numBits; i++) {\n context_data_val = context_data_val << 1\n if (context_data_position == bitsPerChar - 1) {\n context_data_position = 0\n context_data.push(getCharFromInt(context_data_val))\n context_data_val = 0\n } else {\n context_data_position++\n }\n }\n value = context_w.charCodeAt(0)\n for (i = 0; i < 8; i++) {\n context_data_val = (context_data_val << 1) | (value & 1)\n if (context_data_position == bitsPerChar - 1) {\n context_data_position = 0\n context_data.push(getCharFromInt(context_data_val))\n context_data_val = 0\n } else {\n context_data_position++\n }\n value = value >> 1\n }\n } else {\n value = 1\n for (i = 0; i < context_numBits; i++) {\n context_data_val = (context_data_val << 1) | value\n if (context_data_position == bitsPerChar - 1) {\n context_data_position = 0\n context_data.push(getCharFromInt(context_data_val))\n context_data_val = 0\n } else {\n context_data_position++\n }\n value = 0\n }\n value = context_w.charCodeAt(0)\n for (i = 0; i < 16; i++) {\n context_data_val = (context_data_val << 1) | (value & 1)\n if (context_data_position == bitsPerChar - 1) {\n context_data_position = 0\n context_data.push(getCharFromInt(context_data_val))\n context_data_val = 0\n } else {\n context_data_position++\n }\n value = value >> 1\n }\n }\n context_enlargeIn--\n if (context_enlargeIn == 0) {\n context_enlargeIn = Math.pow(2, context_numBits)\n context_numBits++\n }\n delete context_dictionaryToCreate[context_w]\n } else {\n value = context_dictionary[context_w]\n for (i = 0; i < context_numBits; i++) {\n context_data_val = (context_data_val << 1) | (value & 1)\n if (context_data_position == bitsPerChar - 1) {\n context_data_position = 0\n context_data.push(getCharFromInt(context_data_val))\n context_data_val = 0\n } else {\n context_data_position++\n }\n value = value >> 1\n }\n }\n context_enlargeIn--\n if (context_enlargeIn == 0) {\n context_enlargeIn = Math.pow(2, context_numBits)\n context_numBits++\n }\n }\n\n // Mark the end of the stream\n value = 2\n for (i = 0; i < context_numBits; i++) {\n context_data_val = (context_data_val << 1) | (value & 1)\n if (context_data_position == bitsPerChar - 1) {\n context_data_position = 0\n context_data.push(getCharFromInt(context_data_val))\n context_data_val = 0\n } else {\n context_data_position++\n }\n value = value >> 1\n }\n\n // Flush the last char\n while (true) {\n context_data_val = context_data_val << 1\n if (context_data_position == bitsPerChar - 1) {\n context_data.push(getCharFromInt(context_data_val))\n break\n } else context_data_position++\n }\n return context_data.join('')\n },\n\n decompress: function (compressed: string | null) {\n if (compressed == null) return ''\n if (compressed == '') return null\n return LZString._decompress(compressed.length, 32768, function (index) {\n return compressed.charCodeAt(index)\n })\n },\n\n _decompress: function (length: number, resetValue: number, getNextValue: (index: number) => number) {\n const dictionary: (string | number)[] = [],\n result = [],\n data = { val: getNextValue(0), position: resetValue, index: 1 }\n let enlargeIn = 4,\n dictSize = 4,\n numBits = 3,\n entry = '',\n i: number,\n w: string | number,\n bits: number,\n resb: number,\n maxpower: number,\n power: number,\n c: string | number\n\n for (i = 0; i < 3; i += 1) {\n dictionary[i] = i\n }\n\n bits = 0\n maxpower = Math.pow(2, 2)\n power = 1\n while (power != maxpower) {\n resb = data.val & data.position\n data.position >>= 1\n if (data.position == 0) {\n data.position = resetValue\n data.val = getNextValue(data.index++)\n }\n bits |= (resb > 0 ? 1 : 0) * power\n power <<= 1\n }\n\n switch (bits) {\n case 0:\n bits = 0\n maxpower = Math.pow(2, 8)\n power = 1\n while (power != maxpower) {\n resb = data.val & data.position\n data.position >>= 1\n if (data.position == 0) {\n data.position = resetValue\n data.val = getNextValue(data.index++)\n }\n bits |= (resb > 0 ? 1 : 0) * power\n power <<= 1\n }\n c = f(bits)\n break\n case 1:\n bits = 0\n maxpower = Math.pow(2, 16)\n power = 1\n while (power != maxpower) {\n resb = data.val & data.position\n data.position >>= 1\n if (data.position == 0) {\n data.position = resetValue\n data.val = getNextValue(data.index++)\n }\n bits |= (resb > 0 ? 1 : 0) * power\n power <<= 1\n }\n c = f(bits)\n break\n case 2:\n return ''\n }\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n dictionary[3] = c\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n w = c\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n result.push(c)\n while (true) {\n if (data.index > length) {\n return ''\n }\n\n bits = 0\n maxpower = Math.pow(2, numBits)\n power = 1\n while (power != maxpower) {\n resb = data.val & data.position\n data.position >>= 1\n if (data.position == 0) {\n data.position = resetValue\n data.val = getNextValue(data.index++)\n }\n bits |= (resb > 0 ? 1 : 0) * power\n power <<= 1\n }\n\n switch ((c = bits)) {\n case 0:\n bits = 0\n maxpower = Math.pow(2, 8)\n power = 1\n while (power != maxpower) {\n resb = data.val & data.position\n data.position >>= 1\n if (data.position == 0) {\n data.position = resetValue\n data.val = getNextValue(data.index++)\n }\n bits |= (resb > 0 ? 1 : 0) * power\n power <<= 1\n }\n\n dictionary[dictSize++] = f(bits)\n c = dictSize - 1\n enlargeIn--\n break\n case 1:\n bits = 0\n maxpower = Math.pow(2, 16)\n power = 1\n while (power != maxpower) {\n resb = data.val & data.position\n data.position >>= 1\n if (data.position == 0) {\n data.position = resetValue\n data.val = getNextValue(data.index++)\n }\n bits |= (resb > 0 ? 1 : 0) * power\n power <<= 1\n }\n dictionary[dictSize++] = f(bits)\n c = dictSize - 1\n enlargeIn--\n break\n case 2:\n return result.join('')\n }\n\n if (enlargeIn == 0) {\n enlargeIn = Math.pow(2, numBits)\n numBits++\n }\n\n if (dictionary[c]) {\n entry = dictionary[c] as string\n } else {\n if (c === dictSize) {\n entry = w + (w as string).charAt(0)\n } else {\n return null\n }\n }\n result.push(entry)\n\n // Add w+entry[0] to the dictionary.\n dictionary[dictSize++] = w + entry.charAt(0)\n enlargeIn--\n\n w = entry\n\n if (enlargeIn == 0) {\n enlargeIn = Math.pow(2, numBits)\n numBits++\n }\n }\n },\n}\n", "import { version } from '../package.json'\n\n// overriden in posthog-core,\n// e.g. Config.DEBUG = Config.DEBUG || instance.get_config('debug')\nconst Config = {\n DEBUG: false,\n LIB_VERSION: version,\n}\n\nexport default Config\n", "import Config from './config'\nimport { Breaker, EventHandler, Properties } from './types'\n\n/*\n * Saved references to long variable names, so that closure compiler can\n * minimize file size.\n */\n\nconst ArrayProto = Array.prototype\nconst ObjProto = Object.prototype\nconst toString = ObjProto.toString\nconst hasOwnProperty = ObjProto.hasOwnProperty\nconst win: Window & typeof globalThis = typeof window !== 'undefined' ? window : ({} as typeof window)\nconst navigator = win.navigator || { userAgent: '' }\nconst document = win.document || {}\nconst userAgent = navigator.userAgent\n\nconst nativeForEach = ArrayProto.forEach,\n nativeIndexOf = ArrayProto.indexOf,\n nativeIsArray = Array.isArray,\n breaker: Breaker = {}\n\n// Console override\nconst logger = {\n /** @type {function(...*)} */\n log: function (...args: any[]) {\n if (Config.DEBUG && !_isUndefined(window.console) && window.console) {\n // Don't log PostHog debug messages in rrweb\n const log =\n '__rrweb_original__' in window.console.log\n ? (window.console.log as any)['__rrweb_original__']\n : window.console.log\n\n try {\n log.apply(window.console, args)\n } catch (err) {\n _eachArray(args, function (arg) {\n log(arg)\n })\n }\n }\n },\n /** @type {function(...*)} */\n error: function (..._args: any[]) {\n if (Config.DEBUG && !_isUndefined(window.console) && window.console) {\n const args = ['PostHog error:', ..._args]\n // Don't log PostHog debug messages in rrweb\n const error =\n '__rrweb_original__' in window.console.error\n ? (window.console.error as any)['__rrweb_original__']\n : window.console.error\n try {\n error.apply(window.console, args)\n } catch (err) {\n _eachArray(args, function (arg) {\n error(arg)\n })\n }\n }\n },\n /** @type {function(...*)} */\n critical: function (..._args: any[]) {\n if (!_isUndefined(window.console) && window.console) {\n const args = ['PostHog error:', ..._args]\n // Don't log PostHog debug messages in rrweb\n const error =\n '__rrweb_original__' in window.console.error\n ? (window.console.error as any)['__rrweb_original__']\n : window.console.error\n try {\n error.apply(window.console, args)\n } catch (err) {\n _eachArray(args, function (arg) {\n error(arg)\n })\n }\n }\n },\n}\n\n// UNDERSCORE\n// Embed part of the Underscore Library\nexport const _trim = function (str: string): string {\n return str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '')\n}\n\nexport const _bind_instance_methods = function (obj: Record): void {\n for (const func in obj) {\n if (typeof obj[func] === 'function') {\n obj[func] = obj[func].bind(obj)\n }\n }\n}\n\n/**\n * @param {*=} obj\n * @param {function(...*)=} iterator\n * @param {Object=} thisArg\n */\nexport function _each(obj: any, iterator: (value: any, key: any) => void | Breaker, thisArg?: any): void {\n if (obj === null || obj === undefined) {\n return\n }\n if (nativeForEach && Array.isArray(obj) && obj.forEach === nativeForEach) {\n obj.forEach(iterator, thisArg)\n } else if ('length' in obj && obj.length === +obj.length) {\n for (let i = 0, l = obj.length; i < l; i++) {\n if (i in obj && iterator.call(thisArg, obj[i], i) === breaker) {\n return\n }\n }\n } else {\n for (const key in obj) {\n if (hasOwnProperty.call(obj, key)) {\n if (iterator.call(thisArg, obj[key], key) === breaker) {\n return\n }\n }\n }\n }\n}\n\nexport function _eachArray(\n obj: E[] | null | undefined,\n iterator: (value: E, key: number) => void | Breaker,\n thisArg?: any\n): void {\n if (Array.isArray(obj)) {\n if (nativeForEach && obj.forEach === nativeForEach) {\n obj.forEach(iterator, thisArg)\n } else if ('length' in obj && obj.length === +obj.length) {\n for (let i = 0, l = obj.length; i < l; i++) {\n if (i in obj && iterator.call(thisArg, obj[i], i) === breaker) {\n return\n }\n }\n }\n }\n}\n\nexport const _extend = function (obj: Record, ...args: Record[]): Record {\n _eachArray(args, function (source) {\n for (const prop in source) {\n if (source[prop] !== void 0) {\n obj[prop] = source[prop]\n }\n }\n })\n return obj\n}\n\nexport const _isArray =\n nativeIsArray ||\n function (obj: any): obj is any[] {\n return toString.call(obj) === '[object Array]'\n }\n\n// from a comment on http://dbj.org/dbj/?p=286\n// fails on only one very rare and deliberate custom object:\n// let bomb = { toString : undefined, valueOf: function(o) { return \"function BOMBA!\"; }};\nexport const _isFunction = function (f: any): f is (...args: any[]) => any {\n try {\n return /^\\s*\\bfunction\\b/.test(f)\n } catch (x) {\n return false\n }\n}\n\nexport const _include = function (\n obj: null | string | Array | Record,\n target: any\n): boolean | Breaker {\n let found = false\n if (obj === null) {\n return found\n }\n if (nativeIndexOf && obj.indexOf === nativeIndexOf) {\n return obj.indexOf(target) != -1\n }\n _each(obj, function (value) {\n if (found || (found = value === target)) {\n return breaker\n }\n return\n })\n return found\n}\n\nexport function _includes(str: T[] | string, needle: T): boolean {\n return (str as any).indexOf(needle) !== -1\n}\n\n// Underscore Addons\nexport const _isObject = function (obj: any): obj is Record {\n return obj === Object(obj) && !_isArray(obj)\n}\n\nexport const _isEmptyObject = function (obj: any): obj is Record {\n if (_isObject(obj)) {\n for (const key in obj) {\n if (hasOwnProperty.call(obj, key)) {\n return false\n }\n }\n return true\n }\n return false\n}\n\nexport const _isUndefined = function (obj: any): obj is undefined {\n return obj === void 0\n}\n\nexport const _isString = function (obj: any): obj is string {\n return toString.call(obj) == '[object String]'\n}\n\nexport const _isDate = function (obj: any): obj is Date {\n return toString.call(obj) == '[object Date]'\n}\n\nexport const _isNumber = function (obj: any): obj is number {\n return toString.call(obj) == '[object Number]'\n}\n\nexport const _encodeDates = function (obj: Properties): Properties {\n _each(obj, function (v, k) {\n if (_isDate(v)) {\n obj[k] = _formatDate(v)\n } else if (_isObject(v)) {\n obj[k] = _encodeDates(v) // recurse\n }\n })\n return obj\n}\n\nexport const _timestamp = function (): number {\n Date.now =\n Date.now ||\n function () {\n return +new Date()\n }\n return Date.now()\n}\n\nexport const _formatDate = function (d: Date): string {\n // YYYY-MM-DDTHH:MM:SS in UTC\n function pad(n: number) {\n return n < 10 ? '0' + n : n\n }\n return (\n d.getUTCFullYear() +\n '-' +\n pad(d.getUTCMonth() + 1) +\n '-' +\n pad(d.getUTCDate()) +\n 'T' +\n pad(d.getUTCHours()) +\n ':' +\n pad(d.getUTCMinutes()) +\n ':' +\n pad(d.getUTCSeconds())\n )\n}\n\nexport const _safewrap = function any = (...args: any[]) => any>(f: F): F {\n return function (...args) {\n try {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return f.apply(this, args)\n } catch (e) {\n logger.critical('Implementation error. Please turn on debug and contact support@posthog.com.')\n logger.critical(e)\n }\n } as F\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport const _safewrap_class = function (klass: Function, functions: string[]): void {\n for (let i = 0; i < functions.length; i++) {\n klass.prototype[functions[i]] = _safewrap(klass.prototype[functions[i]])\n }\n}\n\nexport const _safewrap_instance_methods = function (obj: Record): void {\n for (const func in obj) {\n if (typeof obj[func] === 'function') {\n obj[func] = _safewrap(obj[func])\n }\n }\n}\n\nexport const _strip_empty_properties = function (p: Properties): Properties {\n const ret: Properties = {}\n _each(p, function (v, k) {\n if (_isString(v) && v.length > 0) {\n ret[k] = v\n }\n })\n return ret\n}\n\n/**\n * Deep copies an object.\n * It handles cycles by replacing all references to them with `undefined`\n * Also supports customizing native values\n *\n * @param value\n * @param customizer\n * @returns {{}|undefined|*}\n */\nfunction deepCircularCopy = Record>(\n value: T,\n customizer?: (value: T[K], key?: K) => T[K]\n): T | undefined {\n const COPY_IN_PROGRESS_SET = new Set()\n\n function internalDeepCircularCopy(value: T, key?: string): T | undefined {\n if (value !== Object(value)) return customizer ? customizer(value as any, key) : value // primitive value\n\n if (COPY_IN_PROGRESS_SET.has(value)) return undefined\n COPY_IN_PROGRESS_SET.add(value)\n let result: T\n\n if (_isArray(value)) {\n result = [] as any as T\n _eachArray(value, (it) => {\n result.push(internalDeepCircularCopy(it))\n })\n } else {\n result = {} as T\n _each(value, (val, key) => {\n if (!COPY_IN_PROGRESS_SET.has(val)) {\n ;(result as any)[key] = internalDeepCircularCopy(val, key)\n }\n })\n }\n return result\n }\n return internalDeepCircularCopy(value)\n}\n\nconst LONG_STRINGS_ALLOW_LIST = ['$performance_raw']\n\nexport function _copyAndTruncateStrings = Record>(\n object: T,\n maxStringLength: number | null\n): T {\n return deepCircularCopy(object, (value: any, key) => {\n if (key && LONG_STRINGS_ALLOW_LIST.indexOf(key as string) > -1) {\n return value\n }\n if (typeof value === 'string' && maxStringLength !== null) {\n return (value as string).slice(0, maxStringLength)\n }\n return value\n }) as T\n}\n\nexport function _base64Encode(data: null): null\nexport function _base64Encode(data: undefined): undefined\nexport function _base64Encode(data: string): string\nexport function _base64Encode(data: string | null | undefined): string | null | undefined {\n const b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='\n let o1,\n o2,\n o3,\n h1,\n h2,\n h3,\n h4,\n bits,\n i = 0,\n ac = 0,\n enc = ''\n const tmp_arr: string[] = []\n\n if (!data) {\n return data\n }\n\n data = _utf8Encode(data)\n\n do {\n // pack three octets into four hexets\n o1 = data.charCodeAt(i++)\n o2 = data.charCodeAt(i++)\n o3 = data.charCodeAt(i++)\n\n bits = (o1 << 16) | (o2 << 8) | o3\n\n h1 = (bits >> 18) & 0x3f\n h2 = (bits >> 12) & 0x3f\n h3 = (bits >> 6) & 0x3f\n h4 = bits & 0x3f\n\n // use hexets to index into b64, and append result to encoded string\n tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4)\n } while (i < data.length)\n\n enc = tmp_arr.join('')\n\n switch (data.length % 3) {\n case 1:\n enc = enc.slice(0, -2) + '=='\n break\n case 2:\n enc = enc.slice(0, -1) + '='\n break\n }\n\n return enc\n}\n\nexport const _utf8Encode = function (string: string): string {\n string = (string + '').replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n')\n\n let utftext = '',\n start,\n end\n let stringl = 0,\n n\n\n start = end = 0\n stringl = string.length\n\n for (n = 0; n < stringl; n++) {\n const c1 = string.charCodeAt(n)\n let enc = null\n\n if (c1 < 128) {\n end++\n } else if (c1 > 127 && c1 < 2048) {\n enc = String.fromCharCode((c1 >> 6) | 192, (c1 & 63) | 128)\n } else {\n enc = String.fromCharCode((c1 >> 12) | 224, ((c1 >> 6) & 63) | 128, (c1 & 63) | 128)\n }\n if (enc !== null) {\n if (end > start) {\n utftext += string.substring(start, end)\n }\n utftext += enc\n start = end = n + 1\n }\n }\n\n if (end > start) {\n utftext += string.substring(start, string.length)\n }\n\n return utftext\n}\n\nexport const _UUID = (function () {\n // Time/ticks information\n // 1*new Date() is a cross browser version of Date.now()\n const T = function () {\n const d = new Date().valueOf()\n let i = 0\n\n // this while loop figures how many browser ticks go by\n // before 1*new Date() returns a new number, ie the amount\n // of ticks that go by per millisecond\n while (d == new Date().valueOf()) {\n i++\n }\n\n return d.toString(16) + i.toString(16)\n }\n\n // Math.Random entropy\n const R = function () {\n return Math.random().toString(16).replace('.', '')\n }\n\n // User agent entropy\n // This function takes the user agent string, and then xors\n // together each sequence of 8 bytes. This produces a final\n // sequence of 8 bytes which it returns as hex.\n const UA = function () {\n const ua = userAgent\n let i,\n ch,\n ret = 0,\n buffer: number[] = []\n\n function xor(result: number, byte_array: number[]) {\n let j,\n tmp = 0\n for (j = 0; j < byte_array.length; j++) {\n tmp |= buffer[j] << (j * 8)\n }\n return result ^ tmp\n }\n\n for (i = 0; i < ua.length; i++) {\n ch = ua.charCodeAt(i)\n buffer.unshift(ch & 0xff)\n if (buffer.length >= 4) {\n ret = xor(ret, buffer)\n buffer = []\n }\n }\n\n if (buffer.length > 0) {\n ret = xor(ret, buffer)\n }\n\n return ret.toString(16)\n }\n\n return function () {\n const se = typeof window !== 'undefined' ? (window.screen.height * window.screen.width).toString(16) : '0'\n return T() + '-' + R() + '-' + UA() + '-' + se + '-' + T()\n }\n})()\n\n// _.isBlockedUA()\n// This is to block various web spiders from executing our JS and\n// sending false capturing data\nexport const _isBlockedUA = function (ua: string): boolean {\n if (\n /(google web preview|baiduspider|yandexbot|bingbot|googlebot|yahoo! slurp|ahrefsbot|facebookexternalhit|facebookcatalog|applebot|semrushbot|duckduckbot|twitterbot|rogerbot|linkedinbot|mj12bot|sitebulb|bot.htm|bot.php|hubspot|crawler)/i.test(\n ua\n )\n ) {\n return true\n }\n return false\n}\n\n/**\n * @param {Object=} formdata\n * @param {string=} arg_separator\n */\nexport const _HTTPBuildQuery = function (formdata: Record, arg_separator = '&'): string {\n let use_val: string\n let use_key: string\n const tph_arr: string[] = []\n\n _each(formdata, function (val, key) {\n use_val = encodeURIComponent(val.toString())\n use_key = encodeURIComponent(key)\n tph_arr[tph_arr.length] = use_key + '=' + use_val\n })\n\n return tph_arr.join(arg_separator)\n}\n\nexport const _getQueryParam = function (url: string, param: string): string {\n // Expects a raw URL\n\n const cleanParam = param.replace(/[[]/, '\\\\[').replace(/[\\]]/, '\\\\]')\n const regexS = '[\\\\?&]' + cleanParam + '=([^&#]*)'\n const regex = new RegExp(regexS)\n const results = regex.exec(url)\n if (results === null || (results && typeof results[1] !== 'string' && (results[1] as any).length)) {\n return ''\n } else {\n let result = results[1]\n try {\n result = decodeURIComponent(result)\n } catch (err) {\n logger.error('Skipping decoding for malformed query param: ' + result)\n }\n return result.replace(/\\+/g, ' ')\n }\n}\n\nexport const _getHashParam = function (hash: string, param: string): string | null {\n const matches = hash.match(new RegExp(param + '=([^&]*)'))\n return matches ? matches[1] : null\n}\n\nexport const _register_event = (function () {\n // written by Dean Edwards, 2005\n // with input from Tino Zijdel - crisp@xs4all.nl\n // with input from Carl Sverre - mail@carlsverre.com\n // with input from PostHog\n // http://dean.edwards.name/weblog/2005/10/add-event/\n // https://gist.github.com/1930440\n\n /**\n * @param {Object} element\n * @param {string} type\n * @param {function(...*)} handler\n * @param {boolean=} oldSchool\n * @param {boolean=} useCapture\n */\n const register_event = function (\n element: Element | Window | Document | Node,\n type: string,\n handler: EventHandler,\n oldSchool?: boolean,\n useCapture?: boolean\n ) {\n if (!element) {\n logger.error('No valid element provided to register_event')\n return\n }\n\n if (element.addEventListener && !oldSchool) {\n element.addEventListener(type, handler, !!useCapture)\n } else {\n const ontype = 'on' + type\n const old_handler = (element as any)[ontype] // can be undefined\n ;(element as any)[ontype] = makeHandler(element, handler, old_handler)\n }\n }\n\n function makeHandler(\n element: Element | Window | Document | Node,\n new_handler: EventHandler,\n old_handlers: EventHandler\n ) {\n return function (event: Event): boolean | void {\n event = event || fixEvent(window.event)\n\n // this basically happens in firefox whenever another script\n // overwrites the onload callback and doesn't pass the event\n // object to previously defined callbacks. All the browsers\n // that don't define window.event implement addEventListener\n // so the dom_loaded handler will still be fired as usual.\n if (!event) {\n return undefined\n }\n\n let ret = true\n let old_result: any\n\n if (_isFunction(old_handlers)) {\n old_result = old_handlers(event)\n }\n const new_result = new_handler.call(element, event)\n\n if (false === old_result || false === new_result) {\n ret = false\n }\n\n return ret\n }\n }\n\n function fixEvent(event: Event | undefined): Event | undefined {\n if (event) {\n event.preventDefault = fixEvent.preventDefault\n event.stopPropagation = fixEvent.stopPropagation\n }\n return event\n }\n fixEvent.preventDefault = function () {\n ;(this as any as Event).returnValue = false\n }\n fixEvent.stopPropagation = function () {\n ;(this as any as Event).cancelBubble = true\n }\n\n return register_event\n})()\n\nexport const _info = {\n campaignParams: function (): Record {\n const campaign_keywords = 'utm_source utm_medium utm_campaign utm_content utm_term gclid fbclid msclkid'.split(\n ' '\n )\n const params: Record = {}\n _each(campaign_keywords, function (kwkey) {\n const kw = _getQueryParam(document.URL, kwkey)\n if (kw.length) {\n params[kwkey] = kw\n }\n })\n\n return params\n },\n\n searchEngine: function (referrer: string): string | null {\n if (referrer.search('https?://(.*)google.([^/?]*)') === 0) {\n return 'google'\n } else if (referrer.search('https?://(.*)bing.com') === 0) {\n return 'bing'\n } else if (referrer.search('https?://(.*)yahoo.com') === 0) {\n return 'yahoo'\n } else if (referrer.search('https?://(.*)duckduckgo.com') === 0) {\n return 'duckduckgo'\n } else {\n return null\n }\n },\n\n searchInfo: function (referrer: string): Record {\n const search = _info.searchEngine(referrer),\n param = search != 'yahoo' ? 'q' : 'p',\n ret: Record = {}\n\n if (search !== null) {\n ret['$search_engine'] = search\n\n const keyword = _getQueryParam(referrer, param)\n if (keyword.length) {\n ret['ph_keyword'] = keyword\n }\n }\n\n return ret\n },\n\n /**\n * This function detects which browser is running this script.\n * The order of the checks are important since many user agents\n * include key words used in later checks.\n */\n browser: function (user_agent: string, vendor: string, opera?: any): string {\n vendor = vendor || '' // vendor is undefined for at least IE9\n if (opera || _includes(user_agent, ' OPR/')) {\n if (_includes(user_agent, 'Mini')) {\n return 'Opera Mini'\n }\n return 'Opera'\n } else if (/(BlackBerry|PlayBook|BB10)/i.test(user_agent)) {\n return 'BlackBerry'\n } else if (_includes(user_agent, 'IEMobile') || _includes(user_agent, 'WPDesktop')) {\n return 'Internet Explorer Mobile'\n } else if (_includes(user_agent, 'SamsungBrowser/')) {\n // https://developer.samsung.com/internet/user-agent-string-format\n return 'Samsung Internet'\n } else if (_includes(user_agent, 'Edge') || _includes(user_agent, 'Edg/')) {\n return 'Microsoft Edge'\n } else if (_includes(user_agent, 'FBIOS')) {\n return 'Facebook Mobile'\n } else if (_includes(user_agent, 'Chrome')) {\n return 'Chrome'\n } else if (_includes(user_agent, 'CriOS')) {\n return 'Chrome iOS'\n } else if (_includes(user_agent, 'UCWEB') || _includes(user_agent, 'UCBrowser')) {\n return 'UC Browser'\n } else if (_includes(user_agent, 'FxiOS')) {\n return 'Firefox iOS'\n } else if (_includes(vendor, 'Apple')) {\n if (_includes(user_agent, 'Mobile')) {\n return 'Mobile Safari'\n }\n return 'Safari'\n } else if (_includes(user_agent, 'Android')) {\n return 'Android Mobile'\n } else if (_includes(user_agent, 'Konqueror')) {\n return 'Konqueror'\n } else if (_includes(user_agent, 'Firefox')) {\n return 'Firefox'\n } else if (_includes(user_agent, 'MSIE') || _includes(user_agent, 'Trident/')) {\n return 'Internet Explorer'\n } else if (_includes(user_agent, 'Gecko')) {\n return 'Mozilla'\n } else {\n return ''\n }\n },\n\n /**\n * This function detects which browser version is running this script,\n * parsing major and minor version (e.g., 42.1). User agent strings from:\n * http://www.useragentstring.com/pages/useragentstring.php\n */\n browserVersion: function (userAgent: string, vendor: string, opera: string): number | null {\n const browser = _info.browser(userAgent, vendor, opera)\n const versionRegexs = {\n 'Internet Explorer Mobile': /rv:(\\d+(\\.\\d+)?)/,\n 'Microsoft Edge': /Edge?\\/(\\d+(\\.\\d+)?)/,\n Chrome: /Chrome\\/(\\d+(\\.\\d+)?)/,\n 'Chrome iOS': /CriOS\\/(\\d+(\\.\\d+)?)/,\n 'UC Browser': /(UCBrowser|UCWEB)\\/(\\d+(\\.\\d+)?)/,\n Safari: /Version\\/(\\d+(\\.\\d+)?)/,\n 'Mobile Safari': /Version\\/(\\d+(\\.\\d+)?)/,\n Opera: /(Opera|OPR)\\/(\\d+(\\.\\d+)?)/,\n Firefox: /Firefox\\/(\\d+(\\.\\d+)?)/,\n 'Firefox iOS': /FxiOS\\/(\\d+(\\.\\d+)?)/,\n Konqueror: /Konqueror:(\\d+(\\.\\d+)?)/,\n BlackBerry: /BlackBerry (\\d+(\\.\\d+)?)/,\n 'Android Mobile': /android\\s(\\d+(\\.\\d+)?)/,\n 'Samsung Internet': /SamsungBrowser\\/(\\d+(\\.\\d+)?)/,\n 'Internet Explorer': /(rv:|MSIE )(\\d+(\\.\\d+)?)/,\n Mozilla: /rv:(\\d+(\\.\\d+)?)/,\n }\n const regex: RegExp | undefined = versionRegexs[browser as keyof typeof versionRegexs]\n if (regex === undefined) {\n return null\n }\n const matches = userAgent.match(regex)\n if (!matches) {\n return null\n }\n return parseFloat(matches[matches.length - 2])\n },\n\n browserLanguage: function (): string {\n return (\n navigator.language || // Any modern browser\n (navigator as Record).userLanguage // IE11\n )\n },\n\n os: function (): string {\n const a = userAgent\n if (/Windows/i.test(a)) {\n if (/Phone/.test(a) || /WPDesktop/.test(a)) {\n return 'Windows Phone'\n }\n return 'Windows'\n } else if (/(iPhone|iPad|iPod)/.test(a)) {\n return 'iOS'\n } else if (/Android/.test(a)) {\n return 'Android'\n } else if (/(BlackBerry|PlayBook|BB10)/i.test(a)) {\n return 'BlackBerry'\n } else if (/Mac/i.test(a)) {\n return 'Mac OS X'\n } else if (/Linux/.test(a)) {\n return 'Linux'\n } else if (/CrOS/.test(a)) {\n return 'Chrome OS'\n } else {\n return ''\n }\n },\n\n device: function (user_agent: string): string {\n if (/Windows Phone/i.test(user_agent) || /WPDesktop/.test(user_agent)) {\n return 'Windows Phone'\n } else if (/iPad/.test(user_agent)) {\n return 'iPad'\n } else if (/iPod/.test(user_agent)) {\n return 'iPod Touch'\n } else if (/iPhone/.test(user_agent)) {\n return 'iPhone'\n } else if (/(BlackBerry|PlayBook|BB10)/i.test(user_agent)) {\n return 'BlackBerry'\n } else if (/Android/.test(user_agent) && !/Mobile/.test(user_agent)) {\n return 'Android Tablet'\n } else if (/Android/.test(user_agent)) {\n return 'Android'\n } else {\n return ''\n }\n },\n\n deviceType: function (user_agent: string): string {\n const device = this.device(user_agent)\n if (device === 'iPad' || device === 'Android Tablet') {\n return 'Tablet'\n } else if (device) {\n return 'Mobile'\n } else {\n return 'Desktop'\n }\n },\n\n referringDomain: function (referrer: string): string {\n const split = referrer.split('/')\n if (split.length >= 3) {\n return split[2]\n }\n return ''\n },\n\n properties: function (): Properties {\n return _extend(\n _strip_empty_properties({\n $os: _info.os(),\n $browser: _info.browser(userAgent, navigator.vendor, (win as any).opera),\n $device: _info.device(userAgent),\n $device_type: _info.deviceType(userAgent),\n }),\n {\n $current_url: win?.location.href,\n $host: win?.location.host,\n $pathname: win?.location.pathname,\n $browser_version: _info.browserVersion(userAgent, navigator.vendor, (win as any).opera),\n $browser_language: _info.browserLanguage(),\n $screen_height: win?.screen.height,\n $screen_width: win?.screen.width,\n $viewport_height: win?.innerHeight,\n $viewport_width: win?.innerWidth,\n $lib: 'web',\n $lib_version: Config.LIB_VERSION,\n $insert_id: Math.random().toString(36).substring(2, 10) + Math.random().toString(36).substring(2, 10),\n $time: _timestamp() / 1000, // epoch time in seconds\n }\n )\n },\n\n people_properties: function (): Properties {\n return _extend(\n _strip_empty_properties({\n $os: _info.os(),\n $browser: _info.browser(userAgent, navigator.vendor, (win as any).opera),\n }),\n {\n $browser_version: _info.browserVersion(userAgent, navigator.vendor, (win as any).opera),\n }\n )\n },\n}\n\nexport { win as window, userAgent, logger, document }\n", "/*\n * Get the className of an element, accounting for edge cases where element.className is an object\n * @param {Element} el - element to get the className of\n * @returns {string} the element's class\n */\nimport { AutocaptureConfig } from 'types'\nimport { _each, _includes, _isUndefined, _trim } from './utils'\n\nexport function getClassName(el: Element): string {\n switch (typeof el.className) {\n case 'string':\n return el.className\n // TODO: when is this ever used?\n case 'object': // handle cases where className might be SVGAnimatedString or some other type\n return ('baseVal' in el.className ? (el.className as any).baseVal : null) || el.getAttribute('class') || ''\n default:\n // future proof\n return ''\n }\n}\n\n/*\n * Get the direct text content of an element, protecting against sensitive data collection.\n * Concats textContent of each of the element's text node children; this avoids potential\n * collection of sensitive data that could happen if we used element.textContent and the\n * element had sensitive child elements, since element.textContent includes child content.\n * Scrubs values that look like they could be sensitive (i.e. cc or ssn number).\n * @param {Element} el - element to get the text of\n * @returns {string} the element's direct text content\n */\nexport function getSafeText(el: Element): string {\n let elText = ''\n\n if (shouldCaptureElement(el) && !isSensitiveElement(el) && el.childNodes && el.childNodes.length) {\n _each(el.childNodes, function (child) {\n if (isTextNode(child) && child.textContent) {\n elText += _trim(child.textContent)\n // scrub potentially sensitive values\n .split(/(\\s+)/)\n .filter(shouldCaptureValue)\n .join('')\n // normalize whitespace\n .replace(/[\\r\\n]/g, ' ')\n .replace(/[ ]+/g, ' ')\n // truncate\n .substring(0, 255)\n }\n })\n }\n\n return _trim(elText)\n}\n\n/*\n * Check whether an element has nodeType Node.ELEMENT_NODE\n * @param {Element} el - element to check\n * @returns {boolean} whether el is of the correct nodeType\n */\nexport function isElementNode(el: Element | undefined | null): el is HTMLElement {\n return !!el && el.nodeType === 1 // Node.ELEMENT_NODE - use integer constant for browser portability\n}\n\n/*\n * Check whether an element is of a given tag type.\n * Due to potential reference discrepancies (such as the webcomponents.js polyfill),\n * we want to match tagNames instead of specific references because something like\n * element === document.body won't always work because element might not be a native\n * element.\n * @param {Element} el - element to check\n * @param {string} tag - tag name (e.g., \"div\")\n * @returns {boolean} whether el is of the given tag type\n */\nexport function isTag(el: Element | undefined | null, tag: string): el is HTMLElement {\n return !!el && !!el.tagName && el.tagName.toLowerCase() === tag.toLowerCase()\n}\n\n/*\n * Check whether an element has nodeType Node.TEXT_NODE\n * @param {Element} el - element to check\n * @returns {boolean} whether el is of the correct nodeType\n */\nexport function isTextNode(el: Element | undefined | null): el is HTMLElement {\n return !!el && el.nodeType === 3 // Node.TEXT_NODE - use integer constant for browser portability\n}\n\n/*\n * Check whether an element has nodeType Node.DOCUMENT_FRAGMENT_NODE\n * @param {Element} el - element to check\n * @returns {boolean} whether el is of the correct nodeType\n */\nexport function isDocumentFragment(el: Element | ParentNode | undefined | null): el is DocumentFragment {\n return !!el && el.nodeType === 11 // Node.DOCUMENT_FRAGMENT_NODE - use integer constant for browser portability\n}\n\nexport const autocaptureCompatibleElements = ['a', 'button', 'form', 'input', 'select', 'textarea', 'label']\n/*\n * Check whether a DOM event should be \"captured\" or if it may contain sentitive data\n * using a variety of heuristics.\n * @param {Element} el - element to check\n * @param {Event} event - event to check\n * @param {Object} autocaptureConfig - autocapture config\n * @returns {boolean} whether the event should be captured\n */\nexport function shouldCaptureDomEvent(\n el: Element,\n event: Event,\n autocaptureConfig: AutocaptureConfig | undefined = undefined\n): boolean {\n if (!el || isTag(el, 'html') || !isElementNode(el)) {\n return false\n }\n\n if (autocaptureConfig?.url_allowlist) {\n const url = window.location.href\n const allowlist = autocaptureConfig.url_allowlist\n if (allowlist && !allowlist.some((regex) => url.match(regex))) {\n return false\n }\n }\n\n if (autocaptureConfig?.dom_event_allowlist) {\n const allowlist = autocaptureConfig.dom_event_allowlist\n if (allowlist && !allowlist.some((eventType) => event.type === eventType)) {\n return false\n }\n }\n\n if (autocaptureConfig?.element_allowlist) {\n const allowlist = autocaptureConfig.element_allowlist\n if (allowlist && !allowlist.some((elementType) => el.tagName.toLowerCase() === elementType)) {\n return false\n }\n }\n\n if (autocaptureConfig?.css_selector_allowlist) {\n const allowlist = autocaptureConfig.css_selector_allowlist\n if (allowlist && !allowlist.some((selector) => el.matches(selector))) {\n return false\n }\n }\n\n let parentIsUsefulElement = false\n const targetElementList: Element[] = [el] // TODO: remove this var, it's never queried\n let parentNode: Element | boolean = true\n let curEl: Element = el\n while (curEl.parentNode && !isTag(curEl, 'body')) {\n // If element is a shadow root, we skip it\n if (isDocumentFragment(curEl.parentNode)) {\n targetElementList.push((curEl.parentNode as any).host)\n curEl = (curEl.parentNode as any).host\n continue\n }\n parentNode = (curEl.parentNode as Element) || false\n if (!parentNode) break\n if (autocaptureCompatibleElements.indexOf(parentNode.tagName.toLowerCase()) > -1) {\n parentIsUsefulElement = true\n } else {\n const compStyles = window.getComputedStyle(parentNode)\n if (compStyles && compStyles.getPropertyValue('cursor') === 'pointer') {\n parentIsUsefulElement = true\n }\n }\n\n targetElementList.push(parentNode)\n curEl = parentNode\n }\n\n const compStyles = window.getComputedStyle(el)\n if (compStyles && compStyles.getPropertyValue('cursor') === 'pointer' && event.type === 'click') {\n return true\n }\n\n const tag = el.tagName.toLowerCase()\n switch (tag) {\n case 'html':\n return false\n case 'form':\n return event.type === 'submit'\n case 'input':\n return event.type === 'change' || event.type === 'click'\n case 'select':\n case 'textarea':\n return event.type === 'change' || event.type === 'click'\n default:\n if (parentIsUsefulElement) return event.type === 'click'\n return (\n event.type === 'click' &&\n (autocaptureCompatibleElements.indexOf(tag) > -1 || el.getAttribute('contenteditable') === 'true')\n )\n }\n}\n\n/*\n * Check whether a DOM element should be \"captured\" or if it may contain sentitive data\n * using a variety of heuristics.\n * @param {Element} el - element to check\n * @returns {boolean} whether the element should be captured\n */\nexport function shouldCaptureElement(el: Element): boolean {\n for (let curEl = el; curEl.parentNode && !isTag(curEl, 'body'); curEl = curEl.parentNode as Element) {\n const classes = getClassName(curEl).split(' ')\n if (_includes(classes, 'ph-sensitive') || _includes(classes, 'ph-no-capture')) {\n return false\n }\n }\n\n if (_includes(getClassName(el).split(' '), 'ph-include')) {\n return true\n }\n\n // don't include hidden or password fields\n const type = (el as HTMLInputElement).type || ''\n if (typeof type === 'string') {\n // it's possible for el.type to be a DOM element if el is a form with a child input[name=\"type\"]\n switch (type.toLowerCase()) {\n case 'hidden':\n return false\n case 'password':\n return false\n }\n }\n\n // filter out data from fields that look like sensitive fields\n const name = (el as HTMLInputElement).name || el.id || ''\n // See https://github.com/posthog/posthog-js/issues/165\n // Under specific circumstances a bug caused .replace to be called on a DOM element\n // instead of a string, removing the element from the page. Ensure this issue is mitigated.\n if (typeof name === 'string') {\n // it's possible for el.name or el.id to be a DOM element if el is a form with a child input[name=\"name\"]\n const sensitiveNameRegex =\n /^cc|cardnum|ccnum|creditcard|csc|cvc|cvv|exp|pass|pwd|routing|seccode|securitycode|securitynum|socialsec|socsec|ssn/i\n if (sensitiveNameRegex.test(name.replace(/[^a-zA-Z0-9]/g, ''))) {\n return false\n }\n }\n\n return true\n}\n\n/*\n * Check whether a DOM element is 'sensitive' and we should only capture limited data\n * @param {Element} el - element to check\n * @returns {boolean} whether the element should be captured\n */\nexport function isSensitiveElement(el: Element): boolean {\n // don't send data from inputs or similar elements since there will always be\n // a risk of clientside javascript placing sensitive data in attributes\n const allowedInputTypes = ['button', 'checkbox', 'submit', 'reset']\n if (\n (isTag(el, 'input') && !allowedInputTypes.includes((el as HTMLInputElement).type)) ||\n isTag(el, 'select') ||\n isTag(el, 'textarea') ||\n el.getAttribute('contenteditable') === 'true'\n ) {\n return true\n }\n return false\n}\n\n/*\n * Check whether a string value should be \"captured\" or if it may contain sentitive data\n * using a variety of heuristics.\n * @param {string} value - string value to check\n * @returns {boolean} whether the element should be captured\n */\nexport function shouldCaptureValue(value: string): boolean {\n if (value === null || _isUndefined(value)) {\n return false\n }\n\n if (typeof value === 'string') {\n value = _trim(value)\n\n // check to see if input value looks like a credit card number\n // see: https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9781449327453/ch04s20.html\n const ccRegex =\n /^(?:(4[0-9]{12}(?:[0-9]{3})?)|(5[1-5][0-9]{14})|(6(?:011|5[0-9]{2})[0-9]{12})|(3[47][0-9]{13})|(3(?:0[0-5]|[68][0-9])[0-9]{11})|((?:2131|1800|35[0-9]{3})[0-9]{11}))$/\n if (ccRegex.test((value || '').replace(/[- ]/g, ''))) {\n return false\n }\n\n // check to see if input value looks like a social security number\n const ssnRegex = /(^\\d{3}-?\\d{2}-?\\d{4}$)/\n if (ssnRegex.test(value)) {\n return false\n }\n }\n\n return true\n}\n\n/*\n * Check whether an attribute name is an Angular style attr (either _ngcontent or _nghost)\n * These update on each build and lead to noise in the element chain\n * More details on the attributes here: https://angular.io/guide/view-encapsulation\n * @param {string} attributeName - string value to check\n * @returns {boolean} whether the element is an angular tag\n */\nexport function isAngularStyleAttr(attributeName: string): boolean {\n if (typeof attributeName === 'string') {\n return attributeName.substring(0, 10) === '_ngcontent' || attributeName.substring(0, 7) === '_nghost'\n }\n return false\n}\n\nexport function loadScript(scriptUrlToLoad: string, callback: (event: Event) => void): void {\n const scriptTag = document.createElement('script')\n scriptTag.type = 'text/javascript'\n scriptTag.src = scriptUrlToLoad\n scriptTag.onload = callback\n\n const scripts = document.querySelectorAll('body > script')\n if (scripts.length > 0) {\n scripts[0].parentNode?.insertBefore(scriptTag, scripts[0])\n } else {\n document.body.appendChild(scriptTag)\n }\n}\n\n/*\n * Iterate through children of a target element looking for span tags\n * and return the text content of the span tags, separated by spaces,\n * along with the direct text content of the target element\n * @param {Element} target - element to check\n * @returns {string} text content of the target element and its child span tags\n */\nexport function getDirectAndNestedSpanText(target: Element): string {\n let text = getSafeText(target)\n text = concatenateStringsWithSpace([text, getNestedSpanText(target)])\n return shouldCaptureValue(text) ? text : ''\n}\n\n/*\n * Iterate through children of a target element looking for span tags\n * and return the text content of the span tags, separated by spaces\n * @param {Element} target - element to check\n * @returns {string} text content of span tags\n */\nexport function getNestedSpanText(target: Element): string {\n let text = ''\n if (target && target.children?.length > 0) {\n for (const child of target.children) {\n if (child && child.nodeType === 1 && child.tagName.toLowerCase() === 'span') {\n const spanText = getSafeText(child)\n if (shouldCaptureValue(spanText)) {\n text = concatenateStringsWithSpace([text, spanText])\n }\n if (child.children.length > 0) {\n text = concatenateStringsWithSpace([text, getNestedSpanText(child)])\n }\n }\n }\n }\n return text\n}\n\n/*\n * Take a list of strings and join them with spaces, filtering out empty strings\n * @param {strings} [] - strings to join\n * @returns {string} - joined strings\n */\nexport function concatenateStringsWithSpace(strings: string[]): string {\n return strings.filter((s) => s).join(' ')\n}\n", "// Naive rage click implementation: If mouse has not moved than RAGE_CLICK_THRESHOLD_PX\n// over RAGE_CLICK_CLICK_COUNT clicks with max RAGE_CLICK_TIMEOUT_MS between clicks, it's\n// counted as a rage click\n\nconst RAGE_CLICK_THRESHOLD_PX = 30\nconst RAGE_CLICK_TIMEOUT_MS = 1000\nconst RAGE_CLICK_CLICK_COUNT = 3\n\nexport default class RageClick {\n clicks: { x: number; y: number; timestamp: number }[]\n enabled: boolean\n\n constructor(enabled: boolean) {\n this.clicks = []\n this.enabled = enabled\n }\n\n isRageClick(x: number, y: number, timestamp: number): boolean {\n if (!this.enabled) {\n return false\n }\n\n const lastClick = this.clicks[this.clicks.length - 1]\n if (\n lastClick &&\n Math.abs(x - lastClick.x) + Math.abs(y - lastClick.y) < RAGE_CLICK_THRESHOLD_PX &&\n timestamp - lastClick.timestamp < RAGE_CLICK_TIMEOUT_MS\n ) {\n this.clicks.push({ x, y, timestamp })\n\n if (this.clicks.length === RAGE_CLICK_CLICK_COUNT) {\n return true\n }\n } else {\n this.clicks = [{ x, y, timestamp }]\n }\n\n return false\n }\n}\n", "import {\n _bind_instance_methods,\n _each,\n _extend,\n _includes,\n _isFunction,\n _isUndefined,\n _register_event,\n _safewrap_instance_methods,\n logger,\n} from './utils'\nimport {\n getClassName,\n getSafeText,\n isElementNode,\n isSensitiveElement,\n isTag,\n isTextNode,\n shouldCaptureDomEvent,\n shouldCaptureElement,\n shouldCaptureValue,\n autocaptureCompatibleElements,\n isAngularStyleAttr,\n isDocumentFragment,\n getDirectAndNestedSpanText,\n} from './autocapture-utils'\nimport RageClick from './extensions/rageclick'\nimport { AutocaptureConfig, AutoCaptureCustomProperty, DecideResponse, Properties } from './types'\nimport { PostHog } from './posthog-core'\n\nconst autocapture = {\n _initializedTokens: [] as string[],\n\n _previousElementSibling: function (el: Element): Element | null {\n if (el.previousElementSibling) {\n return el.previousElementSibling\n } else {\n let _el: Element | null = el\n do {\n _el = _el.previousSibling as Element | null // resolves to ChildNode->Node, which is Element's parent class\n } while (_el && !isElementNode(_el))\n return _el\n }\n },\n\n _getAugmentPropertiesFromElement: function (elem: Element): Properties {\n const shouldCaptureEl = shouldCaptureElement(elem)\n if (!shouldCaptureEl) {\n return {}\n }\n\n const props: Properties = {}\n\n _each(elem.attributes, function (attr: Attr) {\n if (attr.name.startsWith('data-ph-capture-attribute')) {\n const propertyKey = attr.name.replace('data-ph-capture-attribute-', '')\n const propertyValue = attr.value\n if (propertyKey && propertyValue && shouldCaptureValue(propertyValue)) {\n props[propertyKey] = propertyValue\n }\n }\n })\n return props\n },\n\n _getPropertiesFromElement: function (elem: Element, maskInputs: boolean, maskText: boolean): Properties {\n const tag_name = elem.tagName.toLowerCase()\n const props: Properties = {\n tag_name: tag_name,\n }\n if (autocaptureCompatibleElements.indexOf(tag_name) > -1 && !maskText) {\n if (elem.tagName.toLowerCase() === 'a' || elem.tagName.toLowerCase() === 'button') {\n props['$el_text'] = getDirectAndNestedSpanText(elem)\n } else {\n props['$el_text'] = getSafeText(elem)\n }\n }\n\n const classes = getClassName(elem)\n if (classes.length > 0)\n props['classes'] = classes.split(' ').filter(function (c) {\n return c !== ''\n })\n\n _each(elem.attributes, function (attr: Attr) {\n // Only capture attributes we know are safe\n if (isSensitiveElement(elem) && ['name', 'id', 'class'].indexOf(attr.name) === -1) return\n\n if (!maskInputs && shouldCaptureValue(attr.value) && !isAngularStyleAttr(attr.name)) {\n props['attr__' + attr.name] = attr.value\n }\n })\n\n let nthChild = 1\n let nthOfType = 1\n let currentElem: Element | null = elem\n while ((currentElem = this._previousElementSibling(currentElem))) {\n // eslint-disable-line no-cond-assign\n nthChild++\n if (currentElem.tagName === elem.tagName) {\n nthOfType++\n }\n }\n props['nth_child'] = nthChild\n props['nth_of_type'] = nthOfType\n\n return props\n },\n\n _getDefaultProperties: function (eventType: string): Properties {\n return {\n $event_type: eventType,\n $ce_version: 1,\n }\n },\n\n _extractCustomPropertyValue: function (customProperty: AutoCaptureCustomProperty): string {\n const propValues: string[] = []\n _each(document.querySelectorAll(customProperty['css_selector']), function (matchedElem) {\n let value\n\n if (['input', 'select'].indexOf(matchedElem.tagName.toLowerCase()) > -1) {\n value = matchedElem['value']\n } else if (matchedElem['textContent']) {\n value = matchedElem['textContent']\n }\n\n if (shouldCaptureValue(value)) {\n propValues.push(value)\n }\n })\n return propValues.join(', ')\n },\n\n // TODO: delete custom_properties after changeless typescript refactor\n _getCustomProperties: function (targetElementList: Element[]): Properties {\n const props: Properties = {} // will be deleted\n _each(this._customProperties, (customProperty) => {\n _each(customProperty['event_selectors'], (eventSelector) => {\n const eventElements = document.querySelectorAll(eventSelector)\n _each(eventElements, (eventElement) => {\n if (_includes(targetElementList, eventElement) && shouldCaptureElement(eventElement)) {\n props[customProperty['name']] = this._extractCustomPropertyValue(customProperty)\n }\n })\n })\n })\n return props\n },\n\n _getEventTarget: function (e: Event): Element | null {\n // https://developer.mozilla.org/en-US/docs/Web/API/Event/target#Compatibility_notes\n if (typeof e.target === 'undefined') {\n return (e.srcElement as Element) || null\n } else {\n if ((e.target as HTMLElement)?.shadowRoot) {\n return (e.composedPath()[0] as Element) || null\n }\n return (e.target as Element) || null\n }\n },\n\n _captureEvent: function (e: Event, instance: PostHog, eventName = '$autocapture'): boolean | void {\n /*** Don't mess with this code without running IE8 tests on it ***/\n let target = this._getEventTarget(e)\n if (isTextNode(target)) {\n // defeat Safari bug (see: http://www.quirksmode.org/js/events_properties.html)\n target = (target.parentNode || null) as Element | null\n }\n\n if (eventName === '$autocapture' && e.type === 'click' && e instanceof MouseEvent) {\n if (this.rageclicks?.isRageClick(e.clientX, e.clientY, new Date().getTime())) {\n this._captureEvent(e, instance, '$rageclick')\n }\n }\n\n if (target && shouldCaptureDomEvent(target, e, this.config)) {\n const targetElementList = [target]\n let curEl = target\n while (curEl.parentNode && !isTag(curEl, 'body')) {\n if (isDocumentFragment(curEl.parentNode)) {\n targetElementList.push((curEl.parentNode as any).host)\n curEl = (curEl.parentNode as any).host\n continue\n }\n targetElementList.push(curEl.parentNode as Element)\n curEl = curEl.parentNode as Element\n }\n\n const elementsJson: Properties[] = []\n const autocaptureAugmentProperties: Properties = {}\n let href,\n explicitNoCapture = false\n _each(targetElementList, (el) => {\n const shouldCaptureEl = shouldCaptureElement(el)\n\n // if the element or a parent element is an anchor tag\n // include the href as a property\n if (el.tagName.toLowerCase() === 'a') {\n href = el.getAttribute('href')\n href = shouldCaptureEl && shouldCaptureValue(href) && href\n }\n\n // allow users to programmatically prevent capturing of elements by adding class 'ph-no-capture'\n const classes = getClassName(el).split(' ')\n if (_includes(classes, 'ph-no-capture')) {\n explicitNoCapture = true\n }\n\n elementsJson.push(\n this._getPropertiesFromElement(\n el,\n instance.get_config('mask_all_element_attributes'),\n instance.get_config('mask_all_text')\n )\n )\n\n const augmentProperties = this._getAugmentPropertiesFromElement(el)\n _extend(autocaptureAugmentProperties, augmentProperties)\n })\n\n if (!instance.get_config('mask_all_text')) {\n // if the element is a button or anchor tag get the span text from any\n // children and include it as/with the text property on the parent element\n if (target.tagName.toLowerCase() === 'a' || target.tagName.toLowerCase() === 'button') {\n elementsJson[0]['$el_text'] = getDirectAndNestedSpanText(target)\n } else {\n elementsJson[0]['$el_text'] = getSafeText(target)\n }\n }\n\n if (href) {\n elementsJson[0]['attr__href'] = href\n }\n\n if (explicitNoCapture) {\n return false\n }\n\n const props = _extend(\n this._getDefaultProperties(e.type),\n {\n $elements: elementsJson,\n },\n this._getCustomProperties(targetElementList),\n autocaptureAugmentProperties\n )\n\n instance.capture(eventName, props)\n return true\n }\n },\n\n // only reason is to stub for unit tests\n // since you can't override window.location props\n _navigate: function (href: string): void {\n window.location.href = href\n },\n\n _addDomEventHandlers: function (instance: PostHog): void {\n const handler = (e: Event) => {\n e = e || window.event\n this._captureEvent(e, instance)\n }\n _register_event(document, 'submit', handler, false, true)\n _register_event(document, 'change', handler, false, true)\n _register_event(document, 'click', handler, false, true)\n },\n\n _customProperties: [] as AutoCaptureCustomProperty[],\n rageclicks: null as RageClick | null,\n config: undefined as AutocaptureConfig | undefined,\n\n init: function (instance: PostHog): void {\n if (typeof instance.__autocapture !== 'boolean') {\n this.config = instance.__autocapture\n }\n\n // precompile the regex\n if (this.config?.url_allowlist) {\n this.config.url_allowlist = this.config.url_allowlist.map((url) => new RegExp(url))\n }\n\n this.rageclicks = new RageClick(instance.get_config('rageclick'))\n },\n\n afterDecideResponse: function (response: DecideResponse, instance: PostHog): void {\n const token = instance.get_config('token')\n if (this._initializedTokens.indexOf(token) > -1) {\n logger.log('autocapture already initialized for token \"' + token + '\"')\n return\n }\n\n this._initializedTokens.push(token)\n\n if (\n response &&\n response['config'] &&\n response['config']['enable_collect_everything'] &&\n instance.get_config('autocapture')\n ) {\n // TODO: delete custom_properties after changeless typescript refactor\n if (response['custom_properties']) {\n this._customProperties = response['custom_properties']\n }\n this._addDomEventHandlers(instance)\n } else {\n instance['__autocapture'] = false\n }\n },\n\n // this is a mechanism to ramp up CE with no server-side interaction.\n // when CE is active, every page load results in a decide request. we\n // need to gently ramp this up so we don't overload decide. this decides\n // deterministically if CE is enabled for this project by modding the char\n // value of the project token.\n enabledForProject: function (\n token: string | null | undefined,\n numBuckets: number,\n numEnabledBuckets: number\n ): boolean {\n if (!token) {\n return true\n }\n numBuckets = !_isUndefined(numBuckets) ? numBuckets : 10\n numEnabledBuckets = !_isUndefined(numEnabledBuckets) ? numEnabledBuckets : 10\n let charCodeSum = 0\n for (let i = 0; i < token.length; i++) {\n charCodeSum += token.charCodeAt(i)\n }\n return charCodeSum % numBuckets < numEnabledBuckets\n },\n\n isBrowserSupported: function (): boolean {\n return _isFunction(document.querySelectorAll)\n },\n}\n\n_bind_instance_methods(autocapture)\n_safewrap_instance_methods(autocapture)\n\nexport { autocapture }\n", "import { _extend, logger } from './utils'\nimport { PersistentStore, Properties } from './types'\nimport Config from './config'\n\nconst DOMAIN_MATCH_REGEX = /[a-z0-9][a-z0-9-]+\\.[a-z.]{2,6}$/i\n\n// Methods partially borrowed from quirksmode.org/js/cookies.html\nexport const cookieStore: PersistentStore = {\n is_supported: () => true,\n\n error: function (msg) {\n logger.error('cookieStore error: ' + msg)\n },\n\n get: function (name) {\n try {\n const nameEQ = name + '='\n const ca = document.cookie.split(';')\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i]\n while (c.charAt(0) == ' ') {\n c = c.substring(1, c.length)\n }\n if (c.indexOf(nameEQ) === 0) {\n return decodeURIComponent(c.substring(nameEQ.length, c.length))\n }\n }\n } catch (err) {}\n return null\n },\n\n parse: function (name) {\n let cookie\n try {\n cookie = JSON.parse(cookieStore.get(name)) || {}\n } catch (err) {\n // noop\n }\n return cookie\n },\n\n set: function (name, value, days, cross_subdomain, is_secure) {\n try {\n let cdomain = '',\n expires = '',\n secure = ''\n\n if (cross_subdomain) {\n const matches = document.location.hostname.match(DOMAIN_MATCH_REGEX),\n domain = matches ? matches[0] : ''\n\n cdomain = domain ? '; domain=.' + domain : ''\n }\n\n if (days) {\n const date = new Date()\n date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000)\n expires = '; expires=' + date.toUTCString()\n }\n\n if (is_secure) {\n secure = '; secure'\n }\n\n const new_cookie_val =\n name + '=' + encodeURIComponent(JSON.stringify(value)) + expires + '; path=/' + cdomain + secure\n document.cookie = new_cookie_val\n return new_cookie_val\n } catch (err) {\n return\n }\n },\n\n remove: function (name, cross_subdomain) {\n try {\n cookieStore.set(name, '', -1, cross_subdomain)\n } catch (err) {\n return\n }\n },\n}\n\nlet _localStorage_supported: boolean | null = null\n\nexport const localStore: PersistentStore = {\n is_supported: function () {\n if (_localStorage_supported !== null) {\n return _localStorage_supported\n }\n\n let supported = true\n if (typeof window !== 'undefined') {\n try {\n const key = '__mplssupport__',\n val = 'xyz'\n localStore.set(key, val)\n if (localStore.get(key) !== '\"xyz\"') {\n supported = false\n }\n localStore.remove(key)\n } catch (err) {\n supported = false\n }\n } else {\n supported = false\n }\n if (!supported) {\n logger.error('localStorage unsupported; falling back to cookie store')\n }\n\n _localStorage_supported = supported\n return supported\n },\n\n error: function (msg) {\n logger.error('localStorage error: ' + msg)\n },\n\n get: function (name) {\n try {\n return window.localStorage.getItem(name)\n } catch (err) {\n localStore.error(err)\n }\n return null\n },\n\n parse: function (name) {\n try {\n return JSON.parse(localStore.get(name)) || {}\n } catch (err) {\n // noop\n }\n return null\n },\n\n set: function (name, value) {\n try {\n window.localStorage.setItem(name, JSON.stringify(value))\n } catch (err) {\n localStore.error(err)\n }\n },\n\n remove: function (name) {\n try {\n window.localStorage.removeItem(name)\n } catch (err) {\n localStore.error(err)\n }\n },\n}\n\n// Use localstorage for most data but still use cookie for distinct_id\n// This solves issues with cookies having too much data in them causing headers too large\n// Also makes sure we don't have to send a ton of data to the server\nexport const localPlusCookieStore: PersistentStore = {\n ...localStore,\n parse: function (name) {\n try {\n let extend: Properties = {}\n try {\n // See if there's a cookie stored with data.\n extend = cookieStore.parse(name) || {}\n if (extend['distinct_id']) {\n cookieStore.set(name, { distinct_id: extend['distinct_id'] })\n }\n } catch (err) {}\n const value = _extend(extend, JSON.parse(localStore.get(name) || '{}'))\n localStore.set(name, value)\n return value\n } catch (err) {\n // noop\n }\n return null\n },\n\n set: function (name, value, days, cross_subdomain, is_secure) {\n try {\n localStore.set(name, value)\n if (value.distinct_id) {\n cookieStore.set(name, { distinct_id: value.distinct_id }, days, cross_subdomain, is_secure)\n }\n } catch (err) {\n localStore.error(err)\n }\n },\n\n remove: function (name, cross_subdomain) {\n try {\n window.localStorage.removeItem(name)\n cookieStore.remove(name, cross_subdomain)\n } catch (err) {\n localStore.error(err)\n }\n },\n}\n\nconst memoryStorage: Properties = {}\n\n// Storage that only lasts the length of the pageview if we don't want to use cookies\nexport const memoryStore: PersistentStore = {\n is_supported: function () {\n return true\n },\n\n error: function (msg) {\n logger.error('memoryStorage error: ' + msg)\n },\n\n get: function (name) {\n return memoryStorage[name] || null\n },\n\n parse: function (name) {\n return memoryStorage[name] || null\n },\n\n set: function (name, value) {\n memoryStorage[name] = value\n },\n\n remove: function (name) {\n delete memoryStorage[name]\n },\n}\n\nlet sessionStorageSupported: boolean | null = null\nexport const resetSessionStorageSupported = () => {\n sessionStorageSupported = null\n}\n// Storage that only lasts the length of a tab/window. Survives page refreshes\nexport const sessionStore: PersistentStore = {\n is_supported: function () {\n if (sessionStorageSupported !== null) {\n return sessionStorageSupported\n }\n sessionStorageSupported = true\n if (typeof window !== 'undefined') {\n try {\n const key = '__support__',\n val = 'xyz'\n sessionStore.set(key, val)\n if (sessionStore.get(key) !== '\"xyz\"') {\n sessionStorageSupported = false\n }\n sessionStore.remove(key)\n } catch (err) {\n sessionStorageSupported = false\n }\n } else {\n sessionStorageSupported = false\n }\n return sessionStorageSupported\n },\n\n error: function (msg) {\n if (Config.DEBUG) {\n logger.error('sessionStorage error: ', msg)\n }\n },\n\n get: function (name) {\n try {\n return window.sessionStorage.getItem(name)\n } catch (err) {\n sessionStore.error(err)\n }\n return null\n },\n\n parse: function (name) {\n try {\n return JSON.parse(sessionStore.get(name)) || null\n } catch (err) {\n // noop\n }\n return null\n },\n\n set: function (name, value) {\n try {\n window.sessionStorage.setItem(name, JSON.stringify(value))\n } catch (err) {\n sessionStore.error(err)\n }\n },\n\n remove: function (name) {\n try {\n window.sessionStorage.removeItem(name)\n } catch (err) {\n sessionStore.error(err)\n }\n },\n}\n", "/**\n * GDPR utils\n *\n * The General Data Protection Regulation (GDPR) is a regulation in EU law on data protection\n * and privacy for all individuals within the European Union. It addresses the export of personal\n * data outside the EU. The GDPR aims primarily to give control back to citizens and residents\n * over their personal data and to simplify the regulatory environment for international business\n * by unifying the regulation within the EU.\n *\n * This set of utilities is intended to enable opt in/out functionality in the PostHog JS SDK.\n * These functions are used internally by the SDK and are not intended to be publicly exposed.\n */\n\nimport { _each, _includes, _isNumber, _isString, window } from './utils'\nimport { cookieStore, localStore, localPlusCookieStore } from './storage'\nimport { GDPROptions, PersistentStore } from './types'\nimport { PostHog } from './posthog-core'\n\n/**\n * A function used to capture a PostHog event (e.g. PostHogLib.capture)\n * @callback captureFunction\n * @param {String} event_name The name of the event. This can be anything the user does - 'Button Click', 'Sign Up', 'Item Purchased', etc.\n * @param {Object} [properties] A set of properties to include with the event you're sending. These describe the user who did the event or details about the event itself.\n * @param {Function} [callback] If provided, the callback function will be called after capturing the event.\n */\n\n/** Public **/\n\nconst GDPR_DEFAULT_PERSISTENCE_PREFIX = '__ph_opt_in_out_'\n\n/**\n * Opt the user in to data capturing and cookies/localstorage for the given token\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {captureFunction} [options.capture] - function used for capturing a PostHog event to record the opt-in action\n * @param {string} [options.captureEventName] - event name to be used for capturing the opt-in action\n * @param {Object} [options.captureProperties] - set of properties to be captured along with the opt-in action\n * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookieExpiration] - number of days until the opt-in cookie expires\n * @param {boolean} [options.crossSubdomainCookie] - whether the opt-in cookie is set as cross-subdomain or not\n * @param {boolean} [options.secureCookie] - whether the opt-in cookie is set as secure or not\n */\nexport function optIn(token: string, options: GDPROptions): void {\n _optInOut(true, token, options)\n}\n\n/**\n * Opt the user out of data capturing and cookies/localstorage for the given token\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookieExpiration] - number of days until the opt-out cookie expires\n * @param {boolean} [options.crossSubdomainCookie] - whether the opt-out cookie is set as cross-subdomain or not\n * @param {boolean} [options.secureCookie] - whether the opt-out cookie is set as secure or not\n */\nexport function optOut(token: string, options: GDPROptions): void {\n _optInOut(false, token, options)\n}\n\n/**\n * Check whether the user has opted in to data capturing and cookies/localstorage for the given token\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @returns {boolean} whether the user has opted in to the given opt type\n */\nexport function hasOptedIn(token: string, options: GDPROptions): boolean {\n return _getStorageValue(token, options) === '1'\n}\n\n/**\n * Check whether the user has opted out of data capturing and cookies/localstorage for the given token\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @param {boolean} [options.respectDnt] - flag to take browser DNT setting into account\n * @returns {boolean} whether the user has opted out of the given opt type\n */\nexport function hasOptedOut(token: string, options: Partial): boolean {\n if (_hasDoNotTrackFlagOn(options)) {\n return true\n }\n return _getStorageValue(token, options) === '0'\n}\n\n/**\n * Clear the user's opt in/out status of data capturing and cookies/localstorage for the given token\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookieExpiration] - number of days until the opt-in cookie expires\n * @param {boolean} [options.crossSubdomainCookie] - whether the opt-in cookie is set as cross-subdomain or not\n * @param {boolean} [options.secureCookie] - whether the opt-in cookie is set as secure or not\n */\nexport function clearOptInOut(token: string, options: GDPROptions) {\n options = options || {}\n _getStorage(options).remove(_getStorageKey(token, options), !!options.crossSubdomainCookie)\n}\n\n/** Private **/\n\n/**\n * Get storage util\n * @param {Object} [options]\n * @param {string} [options.persistenceType]\n * @returns {object} either cookieStore or localStore\n */\nfunction _getStorage(options: GDPROptions): PersistentStore {\n options = options || {}\n if (options.persistenceType === 'localStorage') {\n return localStore\n }\n if (options.persistenceType === 'localStorage+cookie') {\n return localPlusCookieStore\n }\n return cookieStore\n}\n\n/**\n * Get the name of the cookie that is used for the given opt type (capturing, cookie, etc.)\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @returns {string} the name of the cookie for the given opt type\n */\nfunction _getStorageKey(token: string, options: GDPROptions) {\n options = options || {}\n return (options.persistencePrefix || GDPR_DEFAULT_PERSISTENCE_PREFIX) + token\n}\n\n/**\n * Get the value of the cookie that is used for the given opt type (capturing, cookie, etc.)\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @returns {string} the value of the cookie for the given opt type\n */\nfunction _getStorageValue(token: string, options: GDPROptions) {\n return _getStorage(options).get(_getStorageKey(token, options))\n}\n\n/**\n * Check whether the user has set the DNT/doNotTrack setting to true in their browser\n * @param {Object} [options]\n * @param {string} [options.window] - alternate window object to check; used to force various DNT settings in browser tests\n * @param {boolean} [options.respectDnt] - flag to take browser DNT setting into account\n * @returns {boolean} whether the DNT setting is true\n */\nfunction _hasDoNotTrackFlagOn(options: GDPROptions) {\n if (options && options.respectDnt) {\n const win = (options && options.window) || window\n const nav = win['navigator'] || {}\n let hasDntOn = false\n _each(\n [\n nav['doNotTrack'], // standard\n (nav as any)['msDoNotTrack'],\n (win as any)['doNotTrack'],\n ],\n function (dntValue) {\n if (_includes([true, 1, '1', 'yes'], dntValue)) {\n hasDntOn = true\n }\n }\n )\n return hasDntOn\n }\n return false\n}\n\n/**\n * Set cookie/localstorage for the user indicating that they are opted in or out for the given opt type\n * @param {boolean} optValue - whether to opt the user in or out for the given opt type\n * @param {string} token - PostHog project capturing token\n * @param {Object} [options]\n * @param {captureFunction} [options.capture] - function used for capturing a PostHog event to record the opt-in action\n * @param {string} [options.captureEventName] - event name to be used for capturing the opt-in action\n * @param {Object} [options.captureProperties] - set of properties to be captured along with the opt-in action\n * @param {string} [options.persistencePrefix=__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookieExpiration] - number of days until the opt-in cookie expires\n * @param {boolean} [options.crossSubdomainCookie] - whether the opt-in cookie is set as cross-subdomain or not\n * @param {boolean} [options.secureCookie] - whether the opt-in cookie is set as secure or not\n */\nfunction _optInOut(optValue: boolean, token: string, options: GDPROptions) {\n if (!_isString(token) || !token.length) {\n console.error('gdpr.' + (optValue ? 'optIn' : 'optOut') + ' called with an invalid token')\n return\n }\n\n options = options || {}\n\n _getStorage(options).set(\n _getStorageKey(token, options),\n optValue ? 1 : 0,\n _isNumber(options.cookieExpiration) ? options.cookieExpiration : null,\n options.crossSubdomainCookie,\n options.secureCookie\n )\n\n if (options.capture && optValue) {\n // only capture event if opting in (optValue=true)\n options.capture(options.captureEventName || '$opt_in', options.captureProperties || {}, {\n send_instantly: true,\n })\n }\n}\n\nexport function userOptedOut(posthog: PostHog, silenceErrors: boolean | undefined) {\n let optedOut = false\n\n try {\n const token = posthog.get_config('token')\n const respectDnt = posthog.get_config('respect_dnt')\n const persistenceType = posthog.get_config('opt_out_capturing_persistence_type')\n const persistencePrefix = posthog.get_config('opt_out_capturing_cookie_prefix') || undefined\n const win = posthog.get_config('window' as any) as Window | undefined // used to override window during browser tests\n\n if (token) {\n // if there was an issue getting the token, continue method execution as normal\n optedOut = hasOptedOut(token, {\n respectDnt,\n persistenceType,\n persistencePrefix,\n window: win,\n })\n }\n } catch (err) {\n if (!silenceErrors) {\n console.error('Unexpected error when checking capturing opt-out status: ' + err)\n }\n }\n return optedOut\n}\n\n/**\n * Wrap a method with a check for whether the user is opted out of data capturing and cookies/localstorage for the given token\n * If the user has opted out, return early instead of executing the method.\n * If a callback argument was provided, execute it passing the 0 error code.\n * @param {PostHog} posthog - the posthog instance\n * @param {function} method - wrapped method to be executed if the user has not opted out\n * @param silenceErrors\n * @returns {*} the result of executing method OR undefined if the user has opted out\n */\nexport function addOptOutCheck any = (...args: any[]) => any>(\n posthog: PostHog,\n method: M,\n silenceErrors?: boolean\n): M {\n return function (...args) {\n const optedOut = userOptedOut(posthog, silenceErrors)\n\n if (!optedOut) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return method.apply(this, args)\n }\n\n const callback = args[args.length - 1]\n if (typeof callback === 'function') {\n callback(0)\n }\n\n return\n } as M\n}\n", "/* eslint camelcase: \"off\" */\nimport { addOptOutCheck } from './gdpr-utils'\nimport { _base64Encode, _copyAndTruncateStrings, _each, _encodeDates, _extend, _info, _isObject } from './utils'\nimport { PostHogConfig, Properties, RequestCallback } from './types'\nimport { PostHog } from './posthog-core'\n\nconst SET_ACTION = '$set'\nconst SET_ONCE_ACTION = '$set_once'\n\n/**\n * PostHog People Object\n * @constructor\n */\nclass PostHogPeople {\n _posthog: PostHog\n\n set: (prop: string | Properties, to?: string, callback?: RequestCallback) => void\n set_once: (prop: string | Properties, to?: string, callback?: RequestCallback) => void\n\n constructor(posthog: PostHog) {\n this._posthog = posthog\n\n /*\n * Set properties on a user record.\n *\n * ### Usage:\n *\n * posthog.people.set('gender', 'm');\n *\n * // or set multiple properties at once\n * posthog.people.set({\n * 'Company': 'Acme',\n * 'Plan': 'Premium',\n * 'Upgrade date': new Date()\n * });\n * // properties can be strings, integers, dates, or lists\n *\n * @param {Object|String} prop If a string, this is the name of the property. If an object, this is an associative array of names and values.\n * @param {*} [to] A value to set on the given property name\n * @param {Function} [callback] If provided, the callback will be called after capturing the event.\n */\n this.set = addOptOutCheck(posthog, (prop: string | Properties, to?: string, callback?: RequestCallback) => {\n const data = this.set_action(prop, to)\n if (_isObject(prop)) {\n callback = to as any\n }\n // make sure that the referrer info has been updated and saved\n if (this._get_config('save_referrer')) {\n this._posthog.persistence.update_referrer_info(document.referrer)\n }\n\n // update $set object with default people properties\n data[SET_ACTION] = _extend(\n {},\n _info.people_properties(),\n this._posthog.persistence.get_referrer_info(),\n data[SET_ACTION]\n )\n return this._send_request(data, callback)\n })\n\n /*\n * Set properties on a user record, only if they do not yet exist.\n * This will not overwrite previous people property values, unlike\n * people.set().\n *\n * ### Usage:\n *\n * posthog.people.set_once('First Login Date', new Date());\n *\n * // or set multiple properties at once\n * posthog.people.set_once({\n * 'First Login Date': new Date(),\n * 'Starting Plan': 'Premium'\n * });\n *\n * // properties can be strings, integers or dates\n *\n * @param {Object|String} prop If a string, this is the name of the property. If an object, this is an associative array of names and values.\n * @param {*} [to] A value to set on the given property name\n * @param {Function} [callback] If provided, the callback will be called after capturing the event.\n */\n this.set_once = addOptOutCheck(\n posthog,\n (prop: string | Properties, to?: string, callback?: RequestCallback) => {\n const data = this.set_once_action(prop, to)\n if (_isObject(prop)) {\n callback = to as any\n }\n return this._send_request(data, callback)\n }\n )\n }\n\n toString(): string {\n return this._posthog.toString() + '.people'\n }\n\n _send_request(data: Properties, callback?: RequestCallback): Properties {\n data['$token'] = this._get_config('token')\n data['$distinct_id'] = this._posthog.get_distinct_id()\n const device_id = this._posthog.get_property('$device_id')\n const user_id = this._posthog.get_property('$user_id')\n const had_persisted_distinct_id = this._posthog.get_property('$had_persisted_distinct_id')\n if (device_id) {\n data['$device_id'] = device_id\n }\n if (user_id) {\n data['$user_id'] = user_id\n }\n if (had_persisted_distinct_id) {\n data['$had_persisted_distinct_id'] = had_persisted_distinct_id\n }\n\n const date_encoded_data = _encodeDates(data)\n const truncated_data = _copyAndTruncateStrings(\n date_encoded_data,\n this._get_config('properties_string_max_length')\n )\n const json_data = JSON.stringify(date_encoded_data)\n const encoded_data = _base64Encode(json_data)\n\n this._posthog._send_request(\n this._get_config('api_host') + '/engage/',\n { data: encoded_data },\n {},\n this._posthog._prepare_callback(callback, truncated_data) as RequestCallback\n )\n\n return truncated_data\n }\n\n _get_config(conf_var: K): PostHogConfig[K] {\n return this._posthog.get_config(conf_var)\n }\n\n _is_reserved_property(prop: string): boolean {\n return (\n prop === '$distinct_id' ||\n prop === '$token' ||\n prop === '$device_id' ||\n prop === '$user_id' ||\n prop === '$had_persisted_distinct_id'\n )\n }\n\n // Internal methods for posthog.people API.\n // These methods shouldn't involve network I/O.\n private set_action(prop: string | Properties, to?: string): Properties {\n return this.apiActionParser(SET_ACTION, prop, to)\n }\n\n private set_once_action(prop: string | Properties, to?: string): Properties {\n return this.apiActionParser(SET_ONCE_ACTION, prop, to)\n }\n\n private apiActionParser(actionType: '$set' | '$set_once', prop: string | Properties, to?: string): Properties {\n const data: Properties = {}\n const props: Properties = {}\n\n if (_isObject(prop)) {\n _each(prop, (v, k: string) => {\n if (!(this as any)._is_reserved_property(k)) {\n props[k] = v\n }\n })\n } else {\n props[prop] = to\n }\n\n data[actionType] = props\n return data\n }\n}\n\nexport { PostHogPeople }\n", "import { _base64Encode, _extend } from './utils'\nimport { PostHog } from './posthog-core'\nimport { DecideResponse, FeatureFlagsCallback, JsonType, RequestCallback } from './types'\nimport { PostHogPersistence } from './posthog-persistence'\n\nconst PERSISTENCE_ACTIVE_FEATURE_FLAGS = '$active_feature_flags'\nconst PERSISTENCE_ENABLED_FEATURE_FLAGS = '$enabled_feature_flags'\nconst PERSISTENCE_OVERRIDE_FEATURE_FLAGS = '$override_feature_flags'\nconst PERSISTENCE_FEATURE_FLAG_PAYLOADS = '$feature_flag_payloads'\n\nexport const parseFeatureFlagDecideResponse = (\n response: Partial,\n persistence: PostHogPersistence,\n currentFlags: Record = {},\n currentFlagPayloads: Record = {}\n) => {\n const flags = response['featureFlags']\n const flagPayloads = response['featureFlagPayloads']\n if (flags) {\n // using the v1 api\n if (Array.isArray(flags)) {\n const $enabled_feature_flags: Record = {}\n if (flags) {\n for (let i = 0; i < flags.length; i++) {\n $enabled_feature_flags[flags[i]] = true\n }\n }\n persistence &&\n persistence.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: flags,\n [PERSISTENCE_ENABLED_FEATURE_FLAGS]: $enabled_feature_flags,\n })\n } else {\n // using the v2+ api\n let newFeatureFlags = flags\n let newFeatureFlagPayloads = flagPayloads\n if (response.errorsWhileComputingFlags) {\n // if not all flags were computed, we upsert flags instead of replacing them\n newFeatureFlags = { ...currentFlags, ...newFeatureFlags }\n newFeatureFlagPayloads = { ...currentFlagPayloads, ...newFeatureFlagPayloads }\n }\n persistence &&\n persistence.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: Object.keys(newFeatureFlags || {}),\n [PERSISTENCE_ENABLED_FEATURE_FLAGS]: newFeatureFlags || {},\n [PERSISTENCE_FEATURE_FLAG_PAYLOADS]: newFeatureFlagPayloads || {},\n })\n }\n } else {\n if (persistence) {\n persistence.unregister(PERSISTENCE_ACTIVE_FEATURE_FLAGS)\n persistence.unregister(PERSISTENCE_ENABLED_FEATURE_FLAGS)\n persistence.unregister(PERSISTENCE_FEATURE_FLAG_PAYLOADS)\n }\n }\n}\n\nexport class PostHogFeatureFlags {\n instance: PostHog\n _override_warning: boolean\n flagCallReported: Record\n featureFlagEventHandlers: FeatureFlagsCallback[]\n reloadFeatureFlagsQueued: boolean\n reloadFeatureFlagsInAction: boolean\n $anon_distinct_id: string | undefined\n\n constructor(instance: PostHog) {\n this.instance = instance\n this._override_warning = false\n this.flagCallReported = {}\n this.featureFlagEventHandlers = []\n\n this.reloadFeatureFlagsQueued = false\n this.reloadFeatureFlagsInAction = false\n }\n\n getFlags(): string[] {\n return Object.keys(this.getFlagVariants())\n }\n\n getFlagVariants(): Record {\n const enabledFlags = this.instance.get_property(PERSISTENCE_ENABLED_FEATURE_FLAGS)\n const overriddenFlags = this.instance.get_property(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n if (!overriddenFlags) {\n return enabledFlags || {}\n }\n\n const finalFlags = _extend({}, enabledFlags)\n const overriddenKeys = Object.keys(overriddenFlags)\n for (let i = 0; i < overriddenKeys.length; i++) {\n if (overriddenFlags[overriddenKeys[i]] === false) {\n delete finalFlags[overriddenKeys[i]]\n } else {\n finalFlags[overriddenKeys[i]] = overriddenFlags[overriddenKeys[i]]\n }\n }\n if (!this._override_warning) {\n console.warn('[PostHog] Overriding feature flags!', {\n enabledFlags,\n overriddenFlags,\n finalFlags,\n })\n this._override_warning = true\n }\n return finalFlags\n }\n\n getFlagPayloads(): Record {\n const flagPayloads = this.instance.get_property(PERSISTENCE_FEATURE_FLAG_PAYLOADS)\n return flagPayloads || {}\n }\n\n /**\n * Reloads feature flags asynchronously.\n *\n * Constraints:\n *\n * 1. Avoid parallel requests\n * 2. Delay a few milliseconds after each reloadFeatureFlags call to batch subsequent changes together\n * 3. Don't call this during initial load (as /decide will be called instead), see posthog-core.js\n */\n reloadFeatureFlags(): void {\n if (!this.reloadFeatureFlagsQueued) {\n this.reloadFeatureFlagsQueued = true\n this._startReloadTimer()\n }\n }\n\n setAnonymousDistinctId(anon_distinct_id: string): void {\n this.$anon_distinct_id = anon_distinct_id\n }\n\n setReloadingPaused(isPaused: boolean): void {\n this.reloadFeatureFlagsInAction = isPaused\n }\n\n resetRequestQueue(): void {\n this.reloadFeatureFlagsQueued = false\n }\n\n _startReloadTimer(): void {\n if (this.reloadFeatureFlagsQueued && !this.reloadFeatureFlagsInAction) {\n setTimeout(() => {\n if (!this.reloadFeatureFlagsInAction && this.reloadFeatureFlagsQueued) {\n this.reloadFeatureFlagsQueued = false\n this._reloadFeatureFlagsRequest()\n }\n }, 5)\n }\n }\n\n _reloadFeatureFlagsRequest(): void {\n this.setReloadingPaused(true)\n const token = this.instance.get_config('token')\n const json_data = JSON.stringify({\n token: token,\n distinct_id: this.instance.get_distinct_id(),\n groups: this.instance.getGroups(),\n $anon_distinct_id: this.$anon_distinct_id,\n })\n\n const encoded_data = _base64Encode(json_data)\n this.instance._send_request(\n this.instance.get_config('api_host') + '/decide/?v=3',\n { data: encoded_data },\n { method: 'POST' },\n this.instance._prepare_callback((response) => {\n // reset anon_distinct_id after at least a single request with it\n // makes it through\n this.$anon_distinct_id = undefined\n this.receivedFeatureFlags(response as DecideResponse)\n\n // :TRICKY: Reload - start another request if queued!\n this.setReloadingPaused(false)\n this._startReloadTimer()\n }) as RequestCallback\n )\n }\n\n /*\n * Get feature flag's value for user.\n *\n * ### Usage:\n *\n * if(posthog.getFeatureFlag('my-flag') === 'some-variant') { // do something }\n *\n * @param {Object|String} key Key of the feature flag.\n * @param {Object|String} options (optional) If {send_event: false}, we won't send an $feature_flag_call event to PostHog.\n */\n getFeatureFlag(key: string, options: { send_event?: boolean } = {}): boolean | string {\n if (!this.getFlags()) {\n console.warn('getFeatureFlag for key \"' + key + '\" failed. Feature flags didn\\'t load in time.')\n return false\n }\n const flagValue = this.getFlagVariants()[key]\n if ((options.send_event || !('send_event' in options)) && !this.flagCallReported[key]) {\n this.flagCallReported[key] = true\n this.instance.capture('$feature_flag_called', { $feature_flag: key, $feature_flag_response: flagValue })\n }\n return flagValue\n }\n\n getFeatureFlagPayload(key: string): JsonType {\n const payloads = this.getFlagPayloads()\n return payloads[key]\n }\n\n /*\n * See if feature flag is enabled for user.\n *\n * ### Usage:\n *\n * if(posthog.isFeatureEnabled('beta-feature')) { // do something }\n *\n * @param {Object|String} key Key of the feature flag.\n * @param {Object|String} options (optional) If {send_event: false}, we won't send an $feature_flag_call event to PostHog.\n */\n isFeatureEnabled(key: string, options: { send_event?: boolean } = {}): boolean {\n if (!this.getFlags()) {\n console.warn('isFeatureEnabled for key \"' + key + '\" failed. Feature flags didn\\'t load in time.')\n return false\n }\n return !!this.getFeatureFlag(key, options)\n }\n\n addFeatureFlagsHandler(handler: FeatureFlagsCallback): void {\n this.featureFlagEventHandlers.push(handler)\n }\n\n removeFeatureFlagsHandler(handler: FeatureFlagsCallback): void {\n this.featureFlagEventHandlers = this.featureFlagEventHandlers.filter((h) => h !== handler)\n }\n\n receivedFeatureFlags(response: Partial): void {\n this.instance.decideEndpointWasHit = true\n const currentFlags = this.getFlagVariants()\n const currentFlagPayloads = this.getFlagPayloads()\n parseFeatureFlagDecideResponse(response, this.instance.persistence, currentFlags, currentFlagPayloads)\n const { flags, flagVariants } = this._prepareFeatureFlagsForCallbacks()\n this.featureFlagEventHandlers.forEach((handler) => handler(flags, flagVariants))\n }\n\n /*\n * Override feature flags for debugging.\n *\n * ### Usage:\n *\n * - posthog.feature_flags.override(false)\n * - posthog.feature_flags.override(['beta-feature'])\n * - posthog.feature_flags.override({'beta-feature': 'variant', 'other-feature': True})\n *\n * @param {Object|Array|String} flags Flags to override with.\n */\n override(flags: boolean | string[] | Record): void {\n this._override_warning = false\n\n if (flags === false) {\n this.instance.persistence.unregister(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n } else if (Array.isArray(flags)) {\n const flagsObj: Record = {}\n for (let i = 0; i < flags.length; i++) {\n flagsObj[flags[i]] = true\n }\n this.instance.persistence.register({ [PERSISTENCE_OVERRIDE_FEATURE_FLAGS]: flagsObj })\n } else {\n this.instance.persistence.register({ [PERSISTENCE_OVERRIDE_FEATURE_FLAGS]: flags })\n }\n }\n /*\n * Register an event listener that runs when feature flags become available or when they change.\n * If there are flags, the listener is called immediately in addition to being called on future changes.\n *\n * ### Usage:\n *\n * posthog.onFeatureFlags(function(featureFlags) { // do something })\n *\n * @param {Function} [callback] The callback function will be called once the feature flags are ready or when they are updated.\n * It'll return a list of feature flags enabled for the user.\n * @returns {Function} A function that can be called to unsubscribe the listener. Used by useEffect when the component unmounts.\n */\n onFeatureFlags(callback: FeatureFlagsCallback): () => void {\n this.addFeatureFlagsHandler(callback)\n if (this.instance.decideEndpointWasHit) {\n const { flags, flagVariants } = this._prepareFeatureFlagsForCallbacks()\n callback(flags, flagVariants)\n }\n return () => this.removeFeatureFlagsHandler(callback)\n }\n\n _prepareFeatureFlagsForCallbacks(): { flags: string[]; flagVariants: Record } {\n const flags = this.getFlags()\n const flagVariants = this.getFlagVariants()\n\n // Return truthy\n const truthyFlags = flags.filter((flag) => flagVariants[flag])\n const truthyFlagVariants = Object.keys(flagVariants)\n .filter((variantKey) => flagVariants[variantKey])\n .reduce((res: Record, key) => {\n res[key] = flagVariants[key]\n return res\n }, {})\n\n return {\n flags: truthyFlags,\n flagVariants: truthyFlagVariants,\n }\n }\n}\n", "/* eslint camelcase: \"off\" */\n\nimport { _each, _extend, _include, _info, _isObject, _isUndefined, _strip_empty_properties, logger } from './utils'\nimport { cookieStore, localStore, localPlusCookieStore, memoryStore } from './storage'\nimport { PersistentStore, PostHogConfig, Properties } from './types'\n\n/*\n * Constants\n */\nexport const SET_QUEUE_KEY = '__mps'\nexport const SET_ONCE_QUEUE_KEY = '__mpso'\nexport const UNSET_QUEUE_KEY = '__mpus'\nexport const ADD_QUEUE_KEY = '__mpa'\nexport const APPEND_QUEUE_KEY = '__mpap'\nexport const REMOVE_QUEUE_KEY = '__mpr'\nexport const UNION_QUEUE_KEY = '__mpu'\n// This key is deprecated, but we want to check for it to see whether aliasing is allowed.\nexport const PEOPLE_DISTINCT_ID_KEY = '$people_distinct_id'\nexport const ALIAS_ID_KEY = '__alias'\nexport const CAMPAIGN_IDS_KEY = '__cmpns'\nexport const EVENT_TIMERS_KEY = '__timers'\nexport const SESSION_RECORDING_ENABLED_SERVER_SIDE = '$session_recording_enabled_server_side'\nexport const CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE = '$console_log_recording_enabled_server_side'\nexport const SESSION_RECORDING_RECORDER_VERSION_SERVER_SIDE = '$session_recording_recorder_version_server_side' // follows rrweb versioning\nexport const SESSION_ID = '$sesid'\nexport const ENABLED_FEATURE_FLAGS = '$enabled_feature_flags'\nconst USER_STATE = '$user_state'\n\nexport const RESERVED_PROPERTIES = [\n SET_QUEUE_KEY,\n SET_ONCE_QUEUE_KEY,\n UNSET_QUEUE_KEY,\n ADD_QUEUE_KEY,\n APPEND_QUEUE_KEY,\n REMOVE_QUEUE_KEY,\n UNION_QUEUE_KEY,\n PEOPLE_DISTINCT_ID_KEY,\n ALIAS_ID_KEY,\n CAMPAIGN_IDS_KEY,\n EVENT_TIMERS_KEY,\n SESSION_RECORDING_ENABLED_SERVER_SIDE,\n SESSION_ID,\n ENABLED_FEATURE_FLAGS,\n USER_STATE,\n]\n\n/**\n * PostHog Persistence Object\n * @constructor\n */\nexport class PostHogPersistence {\n props: Properties\n storage: PersistentStore\n campaign_params_saved: boolean\n name: string\n disabled: boolean | undefined\n secure: boolean | undefined\n expire_days: number | undefined\n default_expiry: number | undefined\n cross_subdomain: boolean | undefined\n user_state: 'anonymous' | 'identified'\n\n constructor(config: PostHogConfig) {\n // clean chars that aren't accepted by the http spec for cookie values\n // https://datatracker.ietf.org/doc/html/rfc2616#section-2.2\n let token = ''\n\n if (config['token']) {\n token = config['token'].replace(/\\+/g, 'PL').replace(/\\//g, 'SL').replace(/=/g, 'EQ')\n }\n\n this.props = {}\n this.campaign_params_saved = false\n\n if (config['persistence_name']) {\n this.name = 'ph_' + config['persistence_name']\n } else {\n this.name = 'ph_' + token + '_posthog'\n }\n\n let storage_type = config['persistence'].toLowerCase()\n if (storage_type !== 'cookie' && storage_type.indexOf('localstorage') === -1 && storage_type !== 'memory') {\n logger.critical('Unknown persistence type ' + storage_type + '; falling back to cookie')\n storage_type = config['persistence'] = 'cookie'\n }\n if (storage_type === 'localstorage' && localStore.is_supported()) {\n this.storage = localStore\n } else if (storage_type === 'localstorage+cookie' && localPlusCookieStore.is_supported()) {\n this.storage = localPlusCookieStore\n } else if (storage_type === 'memory') {\n this.storage = memoryStore\n } else {\n this.storage = cookieStore\n }\n\n this.user_state = 'anonymous'\n\n this.load()\n this.update_config(config)\n this.save()\n }\n\n properties(): Properties {\n const p: Properties = {}\n // Filter out reserved properties\n _each(this.props, function (v, k) {\n if (k === ENABLED_FEATURE_FLAGS && typeof v === 'object') {\n const keys = Object.keys(v)\n for (let i = 0; i < keys.length; i++) {\n p[`$feature/${keys[i]}`] = v[keys[i]]\n }\n } else if (!_include(RESERVED_PROPERTIES, k)) {\n p[k] = v\n }\n })\n return p\n }\n\n load(): void {\n if (this.disabled) {\n return\n }\n\n const entry = this.storage.parse(this.name)\n\n if (entry) {\n this.props = _extend({}, entry)\n }\n }\n\n /**\n * NOTE: Saving frequently causes issues with Recordings and Consent Management Platform (CMP) tools which\n * observe cookie changes, and modify their UI, often causing infinite loops.\n * As such callers of this should ideally check that the data has changed beforehand\n */\n save(): void {\n if (this.disabled) {\n return\n }\n this.storage.set(this.name, this.props, this.expire_days, this.cross_subdomain, this.secure)\n }\n\n remove(): void {\n // remove both domain and subdomain cookies\n this.storage.remove(this.name, false)\n this.storage.remove(this.name, true)\n }\n\n // removes the storage entry and deletes all loaded data\n // forced name for tests\n\n clear(): void {\n this.remove()\n this.props = {}\n }\n\n /**\n * @param {Object} props\n * @param {*=} default_value\n * @param {number=} days\n */\n\n register_once(props: Properties, default_value: any, days?: number): boolean {\n if (_isObject(props)) {\n if (typeof default_value === 'undefined') {\n default_value = 'None'\n }\n this.expire_days = typeof days === 'undefined' ? this.default_expiry : days\n\n let hasChanges = false\n\n _each(props, (val, prop) => {\n if (!this.props.hasOwnProperty(prop) || this.props[prop] === default_value) {\n this.props[prop] = val\n hasChanges = true\n }\n })\n\n if (hasChanges) {\n this.save()\n return true\n }\n }\n return false\n }\n\n /**\n * @param {Object} props\n * @param {number=} days\n */\n\n register(props: Properties, days?: number): boolean {\n if (_isObject(props)) {\n this.expire_days = typeof days === 'undefined' ? this.default_expiry : days\n\n let hasChanges = false\n\n _each(props, (val, prop) => {\n if (props.hasOwnProperty(prop) && this.props[prop] !== val) {\n this.props[prop] = val\n hasChanges = true\n }\n })\n\n if (hasChanges) {\n this.save()\n return true\n }\n }\n return false\n }\n\n unregister(prop: string): void {\n if (prop in this.props) {\n delete this.props[prop]\n this.save()\n }\n }\n\n update_campaign_params(): void {\n if (!this.campaign_params_saved) {\n this.register(_info.campaignParams())\n this.campaign_params_saved = true\n }\n }\n\n update_search_keyword(referrer: string): void {\n this.register(_info.searchInfo(referrer))\n }\n\n // EXPORTED METHOD, we test this directly.\n\n update_referrer_info(referrer: string): void {\n this.register({\n $referrer: referrer || this.props['$referrer'] || '$direct',\n $referring_domain: _info.referringDomain(referrer) || this.props['$referring_domain'] || '$direct',\n })\n }\n\n get_referrer_info(): Properties {\n return _strip_empty_properties({\n $referrer: this['props']['$referrer'],\n $referring_domain: this['props']['$referring_domain'],\n })\n }\n\n // safely fills the passed in object with stored properties,\n // does not override any properties defined in both\n // returns the passed in object\n\n safe_merge(props: Properties): Properties {\n _each(this.props, function (val, prop) {\n if (!(prop in props)) {\n props[prop] = val\n }\n })\n\n return props\n }\n\n update_config(config: PostHogConfig): void {\n this.default_expiry = this.expire_days = config['cookie_expiration']\n this.set_disabled(config['disable_persistence'])\n this.set_cross_subdomain(config['cross_subdomain_cookie'])\n this.set_secure(config['secure_cookie'])\n }\n\n set_disabled(disabled: boolean): void {\n this.disabled = disabled\n if (this.disabled) {\n this.remove()\n } else {\n this.save()\n }\n }\n\n set_cross_subdomain(cross_subdomain: boolean): void {\n if (cross_subdomain !== this.cross_subdomain) {\n this.cross_subdomain = cross_subdomain\n this.remove()\n this.save()\n }\n }\n\n get_cross_subdomain(): boolean {\n return !!this.cross_subdomain\n }\n\n set_secure(secure: boolean): void {\n if (secure !== this.secure) {\n this.secure = secure\n this.remove()\n this.save()\n }\n }\n\n set_event_timer(event_name: string, timestamp: number): void {\n const timers = this.props[EVENT_TIMERS_KEY] || {}\n timers[event_name] = timestamp\n this.props[EVENT_TIMERS_KEY] = timers\n this.save()\n }\n\n remove_event_timer(event_name: string): number {\n const timers = this.props[EVENT_TIMERS_KEY] || {}\n const timestamp = timers[event_name]\n if (!_isUndefined(timestamp)) {\n delete this.props[EVENT_TIMERS_KEY][event_name]\n this.save()\n }\n return timestamp\n }\n\n get_user_state(): 'anonymous' | 'identified' {\n return this.props[USER_STATE] || 'anonymous'\n }\n\n set_user_state(state: 'anonymous' | 'identified'): void {\n this.props[USER_STATE] = state\n this.save()\n }\n}\n", "import type { pluginEvent } from 'rrweb/typings/types'\n\nexport const replacementImageURI =\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNOCAwSDE2TDAgMTZWOEw4IDBaIiBmaWxsPSIjMkQyRDJEIi8+CjxwYXRoIGQ9Ik0xNiA4VjE2SDhMMTYgOFoiIGZpbGw9IiMyRDJEMkQiLz4KPC9zdmc+Cg=='\n\nexport const FULL_SNAPSHOT_EVENT_TYPE = 2\nexport const META_EVENT_TYPE = 4\nexport const INCREMENTAL_SNAPSHOT_EVENT_TYPE = 3\nexport const PLUGIN_EVENT_TYPE = 6\nexport const MUTATION_SOURCE_TYPE = 0\n\n/*\n * Check whether a data payload is nearing 5mb. If it is, it checks the data for\n * data URIs (the likely culprit for large payloads). If it finds data URIs, it either replaces\n * it with a generic image (if it's an image) or removes it.\n * @data {object} the rr-web data object\n * @returns {object} the rr-web data object with data uris filtered out\n */\nexport function filterDataURLsFromLargeDataObjects(data: Record): Record {\n if (data && typeof data === 'object') {\n let stringifiedData = JSON.stringify(data)\n // String length of 5000000 is an approximation of 5mb\n // Note: with compression, this limit may be able to be increased\n // but we're assuming most of the size is from a data uri which\n // is unlikely to be compressed further\n if (stringifiedData.length > 5000000) {\n // Regex that matches the pattern for a dataURI with the shape 'data:{mime type};{encoding},{data}'. It:\n // 1) Checks if the pattern starts with 'data:' (potentially, not at the start of the string)\n // 2) Extracts the mime type of the data uri in the first group\n // 3) Determines when the data URI ends.Depending on if it's used in the src tag or css, it can end with a ) or \"\n const dataURIRegex = /data:([\\w\\/\\-\\.]+);(\\w+),([^)\"]*)/gim\n const matches = stringifiedData.matchAll(dataURIRegex)\n for (const match of matches) {\n if (match[1].toLocaleLowerCase().slice(0, 6) === 'image/') {\n stringifiedData = stringifiedData.replace(match[0], replacementImageURI)\n } else {\n stringifiedData = stringifiedData.replace(match[0], '')\n }\n }\n }\n return JSON.parse(stringifiedData)\n }\n return data\n}\n\nexport const CONSOLE_LOG_PLUGIN_NAME = 'rrweb/console@1' // The name of the rr-web plugin that emits console logs\n\n// Console logs can be really large. This function truncates large logs\n// It's a simple function that just truncates long strings.\n// TODO: Ideally this function would have better handling of objects + lists,\n// so they could still be rendered in a pretty way after truncation.\nexport function truncateLargeConsoleLogs(event: pluginEvent<{ payload: string[] }>) {\n const MAX_STRING_SIZE = 2000 // Maximum number of characters allowed in a string\n const MAX_STRINGS_PER_LOG = 10 // A log can consist of multiple strings (e.g. consol.log('string1', 'string2'))\n\n if (\n event &&\n typeof event === 'object' &&\n event.type === PLUGIN_EVENT_TYPE &&\n typeof event.data === 'object' &&\n event.data.plugin === CONSOLE_LOG_PLUGIN_NAME\n ) {\n // Note: event.data.payload.payload comes from rr-web, and is an array of strings\n if (event.data.payload.payload.length > MAX_STRINGS_PER_LOG) {\n event.data.payload.payload = event.data.payload.payload.slice(0, MAX_STRINGS_PER_LOG)\n event.data.payload.payload.push('...[truncated]')\n }\n const updatedPayload = []\n for (let i = 0; i < event.data.payload.payload.length; i++) {\n if (\n event.data.payload.payload[i] && // Value can be null\n event.data.payload.payload[i].length > MAX_STRING_SIZE\n ) {\n updatedPayload.push(event.data.payload.payload[i].slice(0, MAX_STRING_SIZE) + '...[truncated]')\n } else {\n updatedPayload.push(event.data.payload.payload[i])\n }\n }\n event.data.payload.payload = updatedPayload\n return event\n }\n return event\n}\n", "import {\n CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE,\n SESSION_RECORDING_ENABLED_SERVER_SIDE,\n SESSION_RECORDING_RECORDER_VERSION_SERVER_SIDE,\n} from '../posthog-persistence'\nimport {\n filterDataURLsFromLargeDataObjects,\n FULL_SNAPSHOT_EVENT_TYPE,\n INCREMENTAL_SNAPSHOT_EVENT_TYPE,\n META_EVENT_TYPE,\n MUTATION_SOURCE_TYPE,\n truncateLargeConsoleLogs,\n} from './sessionrecording-utils'\nimport { PostHog } from '../posthog-core'\nimport { DecideResponse, Properties } from '../types'\nimport type { record } from 'rrweb/typings'\nimport type { eventWithTime, listenerHandler, pluginEvent, recordOptions } from 'rrweb/typings/types'\nimport { loadScript } from '../autocapture-utils'\nimport Config from '../config'\n\nconst BASE_ENDPOINT = '/e/'\n\nexport class SessionRecording {\n instance: PostHog\n captureStarted: boolean\n snapshots: any[]\n emit: boolean\n endpoint: string\n stopRrweb: listenerHandler | undefined\n windowId: string | null\n sessionId: string | null\n receivedDecide: boolean\n rrwebRecord: typeof record | undefined\n recorderVersion?: string\n\n constructor(instance: PostHog) {\n this.instance = instance\n this.captureStarted = false\n this.snapshots = []\n this.emit = false // Controls whether data is sent to the server or not\n this.endpoint = BASE_ENDPOINT\n this.stopRrweb = undefined\n this.windowId = null\n this.sessionId = null\n this.receivedDecide = false\n }\n\n startRecordingIfEnabled() {\n if (this.isRecordingEnabled()) {\n this.startCaptureAndTrySendingQueuedSnapshots()\n } else {\n this.stopRecording()\n }\n }\n\n started() {\n return this.captureStarted\n }\n\n stopRecording() {\n if (this.captureStarted && this.stopRrweb) {\n this.stopRrweb()\n this.stopRrweb = undefined\n this.captureStarted = false\n }\n }\n\n isRecordingEnabled() {\n const enabled_server_side = !!this.instance.get_property(SESSION_RECORDING_ENABLED_SERVER_SIDE)\n const enabled_client_side = !this.instance.get_config('disable_session_recording')\n return enabled_server_side && enabled_client_side\n }\n\n isConsoleLogCaptureEnabled() {\n const enabled_server_side = !!this.instance.get_property(CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE)\n const enabled_client_side = this.instance.get_config('enable_recording_console_log')\n return enabled_client_side ?? enabled_server_side\n }\n\n getRecordingVersion() {\n const recordingVersion_server_side = this.instance.get_property(SESSION_RECORDING_RECORDER_VERSION_SERVER_SIDE)\n const recordingVersion_client_side = this.instance.get_config('session_recording')?.recorderVersion\n return recordingVersion_client_side || recordingVersion_server_side || 'v1'\n }\n\n afterDecideResponse(response: DecideResponse) {\n this.receivedDecide = true\n if (this.instance.persistence) {\n this.instance.persistence.register({\n [SESSION_RECORDING_ENABLED_SERVER_SIDE]: !!response['sessionRecording'],\n [CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE]: response.sessionRecording?.consoleLogRecordingEnabled,\n [SESSION_RECORDING_RECORDER_VERSION_SERVER_SIDE]: response.sessionRecording?.recorderVersion,\n })\n }\n if (response.sessionRecording?.endpoint) {\n this.endpoint = response.sessionRecording?.endpoint\n }\n\n if (response.sessionRecording?.recorderVersion) {\n this.recorderVersion = response.sessionRecording.recorderVersion\n }\n this.startRecordingIfEnabled()\n }\n\n startCaptureAndTrySendingQueuedSnapshots() {\n // Only submit data after we've received a decide response to account for\n // changing endpoints and the feature being disabled on the server side.\n if (this.receivedDecide) {\n this.emit = true\n this.snapshots.forEach((properties) => this._captureSnapshot(properties))\n }\n this._startCapture()\n }\n\n _startCapture() {\n // According to the rrweb docs, rrweb is not supported on IE11 and below:\n // \"rrweb does not support IE11 and below because it uses the MutationObserver API which was supported by these browsers.\"\n // https://github.com/rrweb-io/rrweb/blob/master/guide.md#compatibility-note\n //\n // However, MutationObserver does exist on IE11, it just doesn't work well and does not detect all changes.\n // Instead, when we load \"recorder.js\", the first JS error is about \"Object.assign\" being undefined.\n // Thus instead of MutationObserver, we look for this function and block recording if it's undefined.\n if (typeof Object.assign === 'undefined') {\n return\n }\n // Nested if block ensures we do not switch recorder versions midway through a recording.\n if (!this.captureStarted && !this.instance.get_config('disable_session_recording')) {\n const recorderJS = this.getRecordingVersion() === 'v2' ? 'recorder-v2.js' : 'recorder.js'\n this.captureStarted = true\n // If recorder.js is already loaded (if array.full.js snippet is used or posthog-js/dist/recorder is\n // imported) or matches the requested recorder version, don't load script. Otherwise, remotely import\n // recorder.js from cdn since it hasn't been loaded.\n if (this.instance.__loaded_recorder_version !== this.getRecordingVersion()) {\n loadScript(\n this.instance.get_config('api_host') + `/static/${recorderJS}?v=${Config.LIB_VERSION}`,\n this._onScriptLoaded.bind(this)\n )\n }\n this._onScriptLoaded()\n }\n }\n\n _updateWindowAndSessionIds(event: eventWithTime) {\n // Some recording events are triggered by non-user events (e.g. \"X minutes ago\" text updating on the screen).\n // We don't want to extend the session or trigger a new session in these cases. These events are designated by event\n // type -> incremental update, and source -> mutation.\n const isNotUserInteraction =\n event.type === INCREMENTAL_SNAPSHOT_EVENT_TYPE && event.data?.source === MUTATION_SOURCE_TYPE\n\n const { windowId, sessionId } = this.instance.sessionManager.checkAndGetSessionAndWindowId(\n isNotUserInteraction,\n event.timestamp\n )\n\n // Event types FullSnapshot and Meta mean we're already in the process of sending a full snapshot\n if (\n (this.windowId !== windowId || this.sessionId !== sessionId) &&\n [FULL_SNAPSHOT_EVENT_TYPE, META_EVENT_TYPE].indexOf(event.type) === -1\n ) {\n this.rrwebRecord?.takeFullSnapshot()\n }\n this.windowId = windowId\n this.sessionId = sessionId\n }\n\n _onScriptLoaded() {\n // rrweb config info: https://github.com/rrweb-io/rrweb/blob/7d5d0033258d6c29599fb08412202d9a2c7b9413/src/record/index.ts#L28\n const sessionRecordingOptions: recordOptions = {\n // select set of rrweb config options we expose to our users\n // see https://github.com/rrweb-io/rrweb/blob/master/guide.md\n blockClass: 'ph-no-capture',\n blockSelector: undefined,\n ignoreClass: 'ph-ignore-input',\n maskAllInputs: true,\n maskInputOptions: {},\n maskInputFn: undefined,\n slimDOMOptions: {},\n collectFonts: false,\n inlineStylesheet: true,\n }\n // We switched from loading all of rrweb to just the record part, but\n // keep backwards compatibility if someone hasn't upgraded PostHog\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.rrwebRecord = window.rrweb ? window.rrweb.record : window.rrwebRecord\n\n // only allows user to set our 'allowlisted' options\n const userSessionRecordingOptions = this.instance.get_config('session_recording')\n for (const [key, value] of Object.entries(userSessionRecordingOptions || {})) {\n if (key in sessionRecordingOptions) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n sessionRecordingOptions[key] = value\n }\n }\n\n this.stopRrweb = this.rrwebRecord?.({\n emit: (event) => {\n event = truncateLargeConsoleLogs(\n filterDataURLsFromLargeDataObjects(event) as pluginEvent<{ payload: string[] }>\n ) as eventWithTime\n\n this._updateWindowAndSessionIds(event)\n\n const properties = {\n $snapshot_data: event,\n $session_id: this.sessionId,\n $window_id: this.windowId,\n }\n\n this.instance._captureMetrics.incr('rrweb-record')\n this.instance._captureMetrics.incr(`rrweb-record-${event.type}`)\n\n if (this.emit) {\n this._captureSnapshot(properties)\n } else {\n this.snapshots.push(properties)\n }\n },\n plugins:\n (window as any).rrwebConsoleRecord && this.isConsoleLogCaptureEnabled()\n ? [(window as any).rrwebConsoleRecord.getRecordConsolePlugin()]\n : [],\n ...sessionRecordingOptions,\n })\n\n // :TRICKY: rrweb does not capture navigation within SPA-s, so hook into our $pageview events to get access to all events.\n // Dropping the initial event is fine (it's always captured by rrweb).\n this.instance._addCaptureHook((eventName) => {\n if (eventName === '$pageview') {\n this.rrwebRecord?.addCustomEvent('$pageview', { href: window.location.href })\n }\n })\n }\n\n _captureSnapshot(properties: Properties) {\n // :TRICKY: Make sure we batch these requests, use a custom endpoint and don't truncate the strings.\n this.instance.capture('$snapshot', properties, {\n transport: 'XHR',\n method: 'POST',\n endpoint: this.endpoint,\n _noTruncate: true,\n _batchKey: 'sessionRecording',\n _metrics: {\n rrweb_full_snapshot: properties.$snapshot_data.type === FULL_SNAPSHOT_EVENT_TYPE,\n },\n })\n }\n}\n", "import { PostHog } from '../posthog-core'\nimport { DecideResponse } from '../types'\n\nconst PERFORMANCE_EVENTS_MAPPING: { [key: string]: number } = {\n // BASE_PERFORMANCE_EVENT_COLUMNS\n entryType: 0,\n timeOrigin: 1,\n name: 2,\n\n // RESOURCE_EVENT_COLUMNS\n startTime: 3,\n redirectStart: 4,\n redirectEnd: 5,\n workerStart: 6,\n fetchStart: 7,\n domainLookupStart: 8,\n domainLookupEnd: 9,\n connectStart: 10,\n secureConnectionStart: 11,\n connectEnd: 12,\n requestStart: 13,\n responseStart: 14,\n responseEnd: 15,\n decodedBodySize: 16,\n encodedBodySize: 17,\n initiatorType: 18,\n nextHopProtocol: 19,\n renderBlockingStatus: 20,\n responseStatus: 21,\n transferSize: 22,\n\n // LARGEST_CONTENTFUL_PAINT_EVENT_COLUMNS\n element: 23,\n renderTime: 24,\n loadTime: 25,\n size: 26,\n id: 27,\n url: 28,\n\n // NAVIGATION_EVENT_COLUMNS\n domComplete: 29,\n domContentLoadedEvent: 30,\n domInteractive: 31,\n loadEventEnd: 32,\n loadEventStart: 33,\n redirectCount: 34,\n navigationType: 35,\n unloadEventEnd: 36,\n unloadEventStart: 37,\n\n // Added after v1\n duration: 39,\n timestamp: 40,\n\n // NOTE: CURRENTLY UNSUPPORTED\n // EVENT_TIMING_EVENT_COLUMNS\n // processingStart: null,\n // processingEnd: null,\n\n // MARK_AND_MEASURE_EVENT_COLUMNS\n // detail: null,\n}\n\nconst ENTRY_TYPES_TO_OBSERVE = [\n // 'event', // This is too noisy as it covers all browser events\n 'first-input',\n // 'mark', // Mark is used too liberally. We would need to filter for specific marks\n // 'measure', // Measure is used too liberally. We would need to filter for specific measures\n 'navigation',\n 'paint',\n 'resource',\n]\n\nconst PERFORMANCE_INGESTION_ENDPOINT = '/e/'\n// Don't monitor posthog paths because then events cause performance events which are events and the snake eats its tail 😱\nconst POSTHOG_PATHS_TO_IGNORE = ['/s/', PERFORMANCE_INGESTION_ENDPOINT]\n\nexport class WebPerformanceObserver {\n instance: PostHog\n remoteEnabled: boolean | undefined\n observer: PerformanceObserver | undefined\n\n constructor(instance: PostHog) {\n this.instance = instance\n }\n\n startObservingIfEnabled() {\n if (this.isEnabled()) {\n this.startObserving()\n } else {\n this.stopObserving()\n }\n }\n\n startObserving() {\n if (this.observer) {\n return\n }\n try {\n this.observer = new PerformanceObserver((list) => {\n list.getEntries().forEach((entry) => {\n this._capturePerformanceEvent(entry)\n })\n })\n\n const entryTypes = PerformanceObserver.supportedEntryTypes.filter((x) => ENTRY_TYPES_TO_OBSERVE.includes(x))\n\n entryTypes.forEach((entryType) => {\n this.observer?.observe({ type: entryType, buffered: true })\n })\n } catch (e) {\n console.error('PostHog failed to start performance observer', e)\n this.stopObserving()\n }\n }\n\n stopObserving() {\n if (this.observer) {\n this.observer.disconnect()\n this.observer = undefined\n }\n }\n\n isObserving() {\n return !!this.observer\n }\n\n isEnabled() {\n return this.instance.get_config('capture_performance') ?? this.remoteEnabled ?? false\n }\n\n afterDecideResponse(response: DecideResponse) {\n this.remoteEnabled = response.capturePerformance || false\n if (this.isEnabled()) {\n this.startObserving()\n }\n }\n\n _capturePerformanceEvent(event: PerformanceEntry) {\n // NOTE: We don't want to capture our own request events.\n\n if (event.name.startsWith(this.instance.get_config('api_host'))) {\n const path = event.name.replace(this.instance.get_config('api_host'), '')\n\n if (POSTHOG_PATHS_TO_IGNORE.find((x) => path.startsWith(x))) {\n return\n }\n }\n\n const eventJson = event.toJSON()\n const properties: { [key: number]: any } = {}\n // kudos to sentry javascript sdk for excellent background on why to use Date.now() here\n // https://github.com/getsentry/sentry-javascript/blob/e856e40b6e71a73252e788cd42b5260f81c9c88e/packages/utils/src/time.ts#L70\n const timeOrigin = Math.floor(Date.now() - performance.now())\n properties[PERFORMANCE_EVENTS_MAPPING['timeOrigin']] = timeOrigin\n // clickhouse can't ingest timestamps that are floats\n // (in this case representing fractions of a millisecond we don't care about anyway)\n properties[PERFORMANCE_EVENTS_MAPPING['timestamp']] = Math.floor(timeOrigin + event.startTime)\n for (const key in PERFORMANCE_EVENTS_MAPPING) {\n if (eventJson[key] !== undefined) {\n properties[PERFORMANCE_EVENTS_MAPPING[key]] = eventJson[key]\n }\n }\n\n this.capturePerformanceEvent(properties)\n\n if (exposesServerTiming(event)) {\n for (const timing of event.serverTiming || []) {\n this.capturePerformanceEvent({\n [PERFORMANCE_EVENTS_MAPPING['timeOrigin']]: timeOrigin,\n [PERFORMANCE_EVENTS_MAPPING['timestamp']]: Math.floor(timeOrigin + event.startTime),\n [PERFORMANCE_EVENTS_MAPPING['name']]: timing.name,\n [PERFORMANCE_EVENTS_MAPPING['duration']]: timing.duration,\n // the spec has a closed list of possible types\n // https://developer.mozilla.org/en-US/docs/Web/API/PerformanceEntry/entryType\n // but, we need to know this was a server timing so that we know to\n // match it to the appropriate navigation or resource timing\n // that matching will have to be on timestamp and $current_url\n [PERFORMANCE_EVENTS_MAPPING['entryType']]: 'serverTiming',\n })\n }\n }\n }\n\n /**\n * :TRICKY: Make sure we batch these requests, and don't truncate the strings.\n */\n private capturePerformanceEvent(properties: { [key: number]: any }) {\n this.instance.capture('$performance_event', properties, {\n transport: 'XHR',\n method: 'POST',\n endpoint: PERFORMANCE_INGESTION_ENDPOINT,\n _noTruncate: true,\n _batchKey: 'performanceEvent',\n })\n }\n}\n\n/**\n * Check if this PerformanceEntry is either a PerformanceResourceTiming or a PerformanceNavigationTiming\n * NB PerformanceNavigationTiming extends PerformanceResourceTiming\n * Here we don't care which interface it implements as both expose `serverTimings`\n */\nconst exposesServerTiming = (event: PerformanceEntry): event is PerformanceResourceTiming =>\n event.entryType === 'navigation' || event.entryType === 'resource'\n", "import { autocapture } from './autocapture'\nimport { _base64Encode } from './utils'\nimport { PostHog } from './posthog-core'\nimport { Compression, DecideResponse } from './types'\n\nexport class Decide {\n instance: PostHog\n\n constructor(instance: PostHog) {\n this.instance = instance\n // don't need to wait for `decide` to return if flags were provided on initialisation\n this.instance.decideEndpointWasHit = this.instance._hasBootstrappedFeatureFlags()\n }\n\n call(): void {\n /*\n Calls /decide endpoint to fetch options for autocapture, session recording, feature flags & compression.\n */\n const json_data = JSON.stringify({\n token: this.instance.get_config('token'),\n distinct_id: this.instance.get_distinct_id(),\n groups: this.instance.getGroups(),\n })\n\n const encoded_data = _base64Encode(json_data)\n this.instance._send_request(\n `${this.instance.get_config('api_host')}/decide/?v=3`,\n { data: encoded_data, verbose: true },\n { method: 'POST' },\n (response) => this.parseDecideResponse(response as DecideResponse)\n )\n }\n\n parseDecideResponse(response: DecideResponse): void {\n if (response?.status === 0) {\n console.error('Failed to fetch feature flags from PostHog.')\n return\n }\n this.instance.decideEndpointWasHit = true\n if (!(document && document.body)) {\n console.log('document not ready yet, trying again in 500 milliseconds...')\n setTimeout(() => {\n this.parseDecideResponse(response)\n }, 500)\n return\n }\n\n this.instance.toolbar.afterDecideResponse(response)\n this.instance.sessionRecording?.afterDecideResponse(response)\n autocapture.afterDecideResponse(response, this.instance)\n this.instance.webPerformance?.afterDecideResponse(response)\n\n this.instance.featureFlags.receivedFeatureFlags(response)\n\n this.instance['compression'] = {}\n if (response['supportedCompression'] && !this.instance.get_config('disable_compression')) {\n const compression: Partial> = {}\n for (const method of response['supportedCompression']) {\n compression[method] = true\n }\n this.instance['compression'] = compression\n }\n\n if (response['siteApps']) {\n if (this.instance.get_config('opt_in_site_apps')) {\n const apiHost = this.instance.get_config('api_host')\n for (const { id, url } of response['siteApps']) {\n const script = document.createElement('script')\n script.src = [\n apiHost,\n apiHost[apiHost.length - 1] === '/' && url[0] === '/' ? url.substring(1) : url,\n ].join('')\n script.onerror = (e) => {\n console.error(`Error while initializing PostHog app with config id ${id}`, e)\n }\n ;(window as any)[`__$$ph_site_app_${id}`] = this.instance\n document.body.appendChild(script)\n }\n } else if (response['siteApps'].length > 0) {\n console.error('PostHog site apps are disabled. Enable the \"opt_in_site_apps\" config to proceed.')\n }\n }\n }\n}\n", "export const POSTHOG_MANAGED_HOSTS = ['https://app.posthog.com', 'https://eu.posthog.com']\n", "import { loadScript } from '../autocapture-utils'\nimport { _getHashParam, _register_event } from '../utils'\nimport { PostHog } from '../posthog-core'\nimport { DecideResponse, ToolbarParams } from '../types'\nimport { POSTHOG_MANAGED_HOSTS } from './cloud'\n\nexport class Toolbar {\n instance: PostHog\n constructor(instance: PostHog) {\n this.instance = instance\n }\n\n afterDecideResponse(response: DecideResponse) {\n const toolbarParams: ToolbarParams =\n response['toolbarParams'] ||\n response['editorParams'] ||\n (response['toolbarVersion'] ? { toolbarVersion: response['toolbarVersion'] } : {})\n if (\n response['isAuthenticated'] &&\n toolbarParams['toolbarVersion'] &&\n toolbarParams['toolbarVersion'].indexOf('toolbar') === 0\n ) {\n this.loadToolbar({\n ...toolbarParams,\n apiURL: this.instance.get_config('api_host'),\n })\n }\n }\n\n /**\n * To load the toolbar, we need an access token and other state. That state comes from one of three places:\n * 1. In the URL hash params\n * 2. From session storage under the key `toolbarParams` if the toolbar was initialized on a previous page\n */\n maybeLoadToolbar(\n location = window.location,\n localStorage: Storage | undefined = undefined,\n history = window.history\n ): boolean {\n try {\n // Before running the code we check if we can access localStorage, if not we opt-out\n if (!localStorage) {\n try {\n window.localStorage.setItem('test', 'test')\n window.localStorage.removeItem('test')\n } catch (error) {\n return false\n }\n\n // If localStorage was undefined, and localStorage is supported we set the default value\n localStorage = window.localStorage\n }\n\n const stateHash = _getHashParam(location.hash, '__posthog') || _getHashParam(location.hash, 'state')\n const state = stateHash ? JSON.parse(decodeURIComponent(stateHash)) : null\n const parseFromUrl = state && state['action'] === 'ph_authorize'\n let toolbarParams: ToolbarParams\n\n if (parseFromUrl) {\n // happens if they are initializing the toolbar using an old snippet\n toolbarParams = state\n toolbarParams.source = 'url'\n\n if (toolbarParams && Object.keys(toolbarParams).length > 0) {\n if (state['desiredHash']) {\n // hash that was in the url before the redirect\n location.hash = state['desiredHash']\n } else if (history) {\n history.replaceState('', document.title, location.pathname + location.search) // completely remove hash\n } else {\n location.hash = '' // clear hash (but leaves # unfortunately)\n }\n }\n } else {\n // get credentials from localStorage from a previous initialzation\n toolbarParams = JSON.parse(localStorage.getItem('_postHogToolbarParams') || '{}')\n toolbarParams.source = 'localstorage'\n\n // delete \"add-action\" or other intent from toolbarParams, otherwise we'll have the same intent\n // every time we open the page (e.g. you just visiting your own site an hour later)\n delete toolbarParams.userIntent\n }\n\n if (!toolbarParams.apiURL) {\n toolbarParams.apiURL = this.instance.get_config('api_host')\n }\n\n if (toolbarParams['token'] && this.instance.get_config('token') === toolbarParams['token']) {\n this.loadToolbar(toolbarParams)\n return true\n } else {\n return false\n }\n } catch (e) {\n return false\n }\n }\n\n loadToolbar(params?: ToolbarParams): boolean {\n if ((window as any)['_postHogToolbarLoaded']) {\n return false\n }\n // only load the toolbar once, even if there are multiple instances of PostHogLib\n ;(window as any)['_postHogToolbarLoaded'] = true\n\n // the toolbar does not use the `jsURL` as that route is cached for 24 hours.\n // By design array.js, recorder.js, and toolbar.js are served from Django with no or limited caching, not from our CDN\n // Django respects the query params for caching, returning a 304 if appropriate\n const host = params?.['apiURL'] || this.instance.get_config('api_host')\n const timestampToNearestThirtySeconds = Math.floor(Date.now() / 30000) * 30000\n const toolbarUrl = `${host}${\n host.endsWith('/') ? '' : '/'\n }static/toolbar.js?_ts=${timestampToNearestThirtySeconds}`\n const disableToolbarMetrics =\n !POSTHOG_MANAGED_HOSTS.includes(this.instance.get_config('api_host')) &&\n this.instance.get_config('advanced_disable_toolbar_metrics')\n\n const toolbarParams = {\n apiURL: host, // defaults to api_host from the instance config if nothing else set\n jsURL: host, // defaults to api_host from the instance config if nothing else set\n token: this.instance.get_config('token'),\n ...params,\n ...(disableToolbarMetrics ? { instrument: false } : {}),\n }\n\n const { source: _discard, ...paramsToPersist } = toolbarParams // eslint-disable-line\n window.localStorage.setItem('_postHogToolbarParams', JSON.stringify(paramsToPersist))\n\n loadScript(toolbarUrl, () => {\n ;((window as any)['ph_load_toolbar'] || (window as any)['ph_load_editor'])(toolbarParams, this.instance)\n })\n // Turbolinks doesn't fire an onload event but does replace the entire body, including the toolbar.\n // Thus, we ensure the toolbar is only loaded inside the body, and then reloaded on turbolinks:load.\n _register_event(window, 'turbolinks:load', () => {\n ;(window as any)['_postHogToolbarLoaded'] = false\n this.loadToolbar(toolbarParams)\n })\n return true\n }\n\n /** @deprecated Use \"loadToolbar\" instead. */\n _loadEditor(params: ToolbarParams): boolean {\n return this.loadToolbar(params)\n }\n\n /** @deprecated Use \"maybeLoadToolbar\" instead. */\n maybeLoadEditor(\n location = window.location,\n localStorage: Storage | undefined = undefined,\n history = window.history\n ): boolean {\n return this.maybeLoadToolbar(location, localStorage, history)\n }\n}\n", "export class RequestQueueScaffold {\n isPolling: boolean // flag to continue to recursively poll or not\n _event_queue: any[]\n _empty_queue_count: number // to track empty polls\n _poller: number | undefined // to become interval for reference to clear later\n _pollInterval: number\n\n constructor(pollInterval = 3000) {\n this.isPolling = true // flag to continue to recursively poll or not\n this._event_queue = []\n this._empty_queue_count = 0 // to track empty polls\n this._poller = undefined // to become interval for reference to clear later\n this._pollInterval = pollInterval\n }\n\n setPollInterval(interval: number): void {\n this._pollInterval = interval\n // Reset interval if running already\n if (this.isPolling) {\n this.poll()\n }\n }\n\n // // eslint-disable-next-line no-unused-vars\n // enqueue(_requestData: Record): void {\n // return\n // }\n\n poll(): void {\n return\n }\n\n unload(): void {\n return\n }\n\n getTime(): number {\n return new Date().getTime()\n }\n}\n", "import { RequestQueueScaffold } from './base-request-queue'\nimport { _each } from './utils'\nimport { CaptureMetrics } from './capture-metrics'\nimport { Properties, QueuedRequestData, XHROptions } from './types'\n\nexport class RequestQueue extends RequestQueueScaffold {\n captureMetrics: CaptureMetrics\n handlePollRequest: (url: string, data: Properties, options?: XHROptions) => void\n\n constructor(\n captureMetrics: CaptureMetrics,\n handlePollRequest: (url: string, data: Properties, options?: XHROptions) => void,\n pollInterval = 3000\n ) {\n super(pollInterval)\n this.handlePollRequest = handlePollRequest\n this.captureMetrics = captureMetrics\n }\n\n enqueue(url: string, data: Properties, options: XHROptions): void {\n this.captureMetrics.incr('batch-enqueue')\n\n this._event_queue.push({ url, data, options })\n\n if (!this.isPolling) {\n this.isPolling = true\n this.poll()\n }\n }\n\n poll(): void {\n clearTimeout(this._poller)\n this._poller = setTimeout(() => {\n if (this._event_queue.length > 0) {\n const requests = this.formatQueue()\n for (const key in requests) {\n const { url, data, options } = requests[key]\n _each(data, (_, dataKey) => {\n data[dataKey]['offset'] = Math.abs(data[dataKey]['timestamp'] - this.getTime())\n delete data[dataKey]['timestamp']\n })\n this.handlePollRequest(url, data, options)\n\n this.captureMetrics.incr('batch-requests')\n this.captureMetrics.incr(`batch-requests-${url.slice(url.length - 2)}`)\n this.captureMetrics.incr('batch-handle', data.length)\n this.captureMetrics.incr(`batch-handle-${url.slice(url.length - 2)}`, data.length)\n }\n this._event_queue.length = 0 // flush the _event_queue\n this._empty_queue_count = 0\n } else {\n this._empty_queue_count++\n }\n\n /**\n * _empty_queue_count will increment each time the queue is polled\n * and it is empty. To avoid empty polling (user went idle, stepped away from comp)\n * we can turn it off with the isPolling flag.\n *\n * Polling will be re enabled when the next time PostHogLib.capture is called with\n * an event that should be added to the event queue.\n */\n if (this._empty_queue_count > 4) {\n this.isPolling = false\n this._empty_queue_count = 0\n }\n if (this.isPolling) {\n this.poll()\n }\n }, this._pollInterval) as any as number\n }\n\n updateUnloadMetrics(): void {\n const requests = this.formatQueue()\n for (const key in requests) {\n const { url, data } = requests[key]\n\n this.captureMetrics.incr('batch-unload-requests')\n this.captureMetrics.incr(`batch-unload-requests-${url.slice(url.length - 2)}`)\n this.captureMetrics.incr('batch-unload', data.length)\n this.captureMetrics.incr(`batch-unload-${url.slice(url.length - 2)}`, data.length)\n }\n }\n\n unload(): void {\n clearTimeout(this._poller)\n const requests = this._event_queue.length > 0 ? this.formatQueue() : {}\n this._event_queue.length = 0\n const requestValues = Object.values(requests)\n\n // Always force events to be sent before recordings, as events are more important, and recordings are bigger and thus less likely to arrive\n const sortedRequests = [\n ...requestValues.filter((r) => r.url.indexOf('/e') === 0),\n ...requestValues.filter((r) => r.url.indexOf('/e') !== 0),\n ]\n sortedRequests.map(({ url, data, options }) => {\n this.handlePollRequest(url, data, { ...options, transport: 'sendBeacon' })\n })\n }\n\n formatQueue(): Record {\n const requests: Record = {}\n _each(this._event_queue, (request) => {\n const { url, data, options } = request\n const key = (options ? options._batchKey : null) || url\n if (requests[key] === undefined) {\n requests[key] = { data: [], url, options }\n }\n\n // :TRICKY: Metrics-only code\n if (\n options &&\n requests[key].options &&\n requests[key].options._metrics &&\n !(requests[key].options._metrics as any)['rrweb_full_snapshot']\n ) {\n ;(requests[key].options._metrics as any)['rrweb_full_snapshot'] =\n options._metrics['rrweb_full_snapshot']\n }\n requests[key].data.push(data)\n })\n return requests\n }\n}\n", "export class CaptureMetrics {\n enabled: boolean\n metrics: Record\n\n constructor(enabled: boolean) {\n this.enabled = enabled\n this.metrics = {}\n }\n\n incr(key: string, by = 1): void {\n if (this.enabled) {\n key = `phjs-${key}`\n this.metrics[key] = (this.metrics[key] || 0) + by\n }\n }\n\n decr(key: string): void {\n if (this.enabled) {\n key = `phjs-${key}`\n this.metrics[key] = (this.metrics[key] || 0) - 1\n }\n }\n}\n", "// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Much of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// Many optimizations have been made, so the bundle size is ultimately smaller but performance is similar.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar wk = (function (c, id, msg, transfer, cb) {\n var u = ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([c], { type: 'text/javascript' })));\n var w = new Worker(u);\n w.onerror = function (e) { return cb(e.error, null); };\n w.onmessage = function (e) { return cb(null, e.data); };\n w.postMessage(msg, transfer);\n return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, u32 = Uint32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\n// see fleb note\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n var b = new u16(31);\n for (var i = 0; i < 31; ++i) {\n b[i] = start += 1 << eb[i - 1];\n }\n // numbers here are at max 18 bits\n var r = new u32(b[30]);\n for (var i = 1; i < 30; ++i) {\n for (var j = b[i]; j < b[i + 1]; ++j) {\n r[j] = ((j - b[i]) << 5) | i;\n }\n }\n return [b, r];\n};\nvar _a = freb(fleb, 2), fl = _a[0], revfl = _a[1];\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b[0], revfd = _b[1];\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n // reverse table algorithm from SO\n var x = ((i & 0xAAAA) >>> 1) | ((i & 0x5555) << 1);\n x = ((x & 0xCCCC) >>> 2) | ((x & 0x3333) << 2);\n x = ((x & 0xF0F0) >>> 4) | ((x & 0x0F0F) << 4);\n rev[i] = (((x & 0xFF00) >>> 8) | ((x & 0x00FF) << 8)) >>> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n var s = cd.length;\n // index\n var i = 0;\n // u16 \"map\": index -> # of codes with bit length = index\n var l = new u16(mb);\n // length of cd must be 288 (total # of codes)\n for (; i < s; ++i)\n ++l[cd[i] - 1];\n // u16 \"map\": index -> minimum code for bit length = index\n var le = new u16(mb);\n for (i = 0; i < mb; ++i) {\n le[i] = (le[i - 1] + l[i - 1]) << 1;\n }\n var co;\n if (r) {\n // u16 \"map\": index -> number of actual bits, symbol for code\n co = new u16(1 << mb);\n // bits to remove for reverser\n var rvb = 15 - mb;\n for (i = 0; i < s; ++i) {\n // ignore 0 lengths\n if (cd[i]) {\n // num encoding both symbol and bits read\n var sv = (i << 4) | cd[i];\n // free bits\n var r_1 = mb - cd[i];\n // start value\n var v = le[cd[i] - 1]++ << r_1;\n // m is end value\n for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n // every 16 bit value starting with the code yields the same result\n co[rev[v] >>> rvb] = sv;\n }\n }\n }\n }\n else {\n co = new u16(s);\n for (i = 0; i < s; ++i)\n co[i] = rev[le[cd[i] - 1]++] >>> (15 - cd[i]);\n }\n return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n var m = a[0];\n for (var i = 1; i < a.length; ++i) {\n if (a[i] > m)\n m = a[i];\n }\n return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n var o = (p / 8) >> 0;\n return ((d[o] | (d[o + 1] << 8)) >>> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n var o = (p / 8) >> 0;\n return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >>> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p / 8) >> 0) + (p & 7 && 1); };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n // can't use .constructor in case user-supplied\n var n = new (v instanceof u16 ? u16 : v instanceof u32 ? u32 : u8)(e - s);\n n.set(v.subarray(s, e));\n return n;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, buf, st) {\n // source length\n var sl = dat.length;\n // have to estimate size\n var noBuf = !buf || st;\n // no state\n var noSt = !st || st.i;\n if (!st)\n st = {};\n // Assumes roughly 33% compression ratio average\n if (!buf)\n buf = new u8(sl * 3);\n // ensure buffer can fit at least l elements\n var cbuf = function (l) {\n var bl = buf.length;\n // need to increase size to fit\n if (l > bl) {\n // Double or set to necessary, whichever is greater\n var nbuf = new u8(Math.max(bl * 2, l));\n nbuf.set(buf);\n buf = nbuf;\n }\n };\n // last chunk bitpos bytes\n var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n // total bits\n var tbts = sl * 8;\n do {\n if (!lm) {\n // BFINAL - this is only 1 when last chunk is next\n st.f = final = bits(dat, pos, 1);\n // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n var type = bits(dat, pos + 1, 3);\n pos += 3;\n if (!type) {\n // go to end of byte boundary\n var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n if (t > sl) {\n if (noSt)\n throw 'unexpected EOF';\n break;\n }\n // ensure size\n if (noBuf)\n cbuf(bt + l);\n // Copy over uncompressed data\n buf.set(dat.subarray(s, t), bt);\n // Get new bitpos, update byte count\n st.b = bt += l, st.p = pos = t * 8;\n continue;\n }\n else if (type == 1)\n lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n else if (type == 2) {\n // literal lengths\n var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n var tl = hLit + bits(dat, pos + 5, 31) + 1;\n pos += 14;\n // length+distance tree\n var ldt = new u8(tl);\n // code length tree\n var clt = new u8(19);\n for (var i = 0; i < hcLen; ++i) {\n // use index map to get real code\n clt[clim[i]] = bits(dat, pos + i * 3, 7);\n }\n pos += hcLen * 3;\n // code lengths bits\n var clb = max(clt), clbmsk = (1 << clb) - 1;\n if (!noSt && pos + tl * (clb + 7) > tbts)\n break;\n // code lengths map\n var clm = hMap(clt, clb, 1);\n for (var i = 0; i < tl;) {\n var r = clm[bits(dat, pos, clbmsk)];\n // bits read\n pos += r & 15;\n // symbol\n var s = r >>> 4;\n // code length to copy\n if (s < 16) {\n ldt[i++] = s;\n }\n else {\n // copy count\n var c = 0, n = 0;\n if (s == 16)\n n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n else if (s == 17)\n n = 3 + bits(dat, pos, 7), pos += 3;\n else if (s == 18)\n n = 11 + bits(dat, pos, 127), pos += 7;\n while (n--)\n ldt[i++] = c;\n }\n }\n // length tree distance tree\n var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n // max length bits\n lbt = max(lt);\n // max dist bits\n dbt = max(dt);\n lm = hMap(lt, lbt, 1);\n dm = hMap(dt, dbt, 1);\n }\n else\n throw 'invalid block type';\n if (pos > tbts)\n throw 'unexpected EOF';\n }\n // Make sure the buffer can hold this + the largest possible addition\n // Maximum chunk size (practically, theoretically infinite) is 2^17;\n if (noBuf)\n cbuf(bt + 131072);\n var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n var mxa = lbt + dbt + 18;\n while (noSt || pos + mxa < tbts) {\n // bits read, code\n var c = lm[bits16(dat, pos) & lms], sym = c >>> 4;\n pos += c & 15;\n if (pos > tbts)\n throw 'unexpected EOF';\n if (!c)\n throw 'invalid length/literal';\n if (sym < 256)\n buf[bt++] = sym;\n else if (sym == 256) {\n lm = null;\n break;\n }\n else {\n var add = sym - 254;\n // no extra bits needed if less\n if (sym > 264) {\n // index\n var i = sym - 257, b = fleb[i];\n add = bits(dat, pos, (1 << b) - 1) + fl[i];\n pos += b;\n }\n // dist\n var d = dm[bits16(dat, pos) & dms], dsym = d >>> 4;\n if (!d)\n throw 'invalid distance';\n pos += d & 15;\n var dt = fd[dsym];\n if (dsym > 3) {\n var b = fdeb[dsym];\n dt += bits16(dat, pos) & ((1 << b) - 1), pos += b;\n }\n if (pos > tbts)\n throw 'unexpected EOF';\n if (noBuf)\n cbuf(bt + 131072);\n var end = bt + add;\n for (; bt < end; bt += 4) {\n buf[bt] = buf[bt - dt];\n buf[bt + 1] = buf[bt + 1 - dt];\n buf[bt + 2] = buf[bt + 2 - dt];\n buf[bt + 3] = buf[bt + 3 - dt];\n }\n bt = end;\n }\n }\n st.l = lm, st.p = pos, st.b = bt;\n if (lm)\n final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n } while (!final);\n return bt == buf.length ? buf : slc(buf, 0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) >> 0;\n d[o] |= v;\n d[o + 1] |= v >>> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) >> 0;\n d[o] |= v;\n d[o + 1] |= v >>> 8;\n d[o + 2] |= v >>> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n // Need extra info to make a tree\n var t = [];\n for (var i = 0; i < d.length; ++i) {\n if (d[i])\n t.push({ s: i, f: d[i] });\n }\n var s = t.length;\n var t2 = t.slice();\n if (!s)\n return [new u8(0), 0];\n if (s == 1) {\n var v = new u8(t[0].s + 1);\n v[t[0].s] = 1;\n return [v, 1];\n }\n t.sort(function (a, b) { return a.f - b.f; });\n // after i2 reaches last ind, will be stopped\n // freq must be greater than largest possible number of symbols\n t.push({ s: -1, f: 25001 });\n var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n // efficient algorithm from UZIP.js\n // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n // symbols that combined have high freq, will start processing i2 (high-freq,\n // non-composite) symbols instead\n // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n while (i1 != s - 1) {\n l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n }\n var maxSym = t2[0].s;\n for (var i = 1; i < s; ++i) {\n if (t2[i].s > maxSym)\n maxSym = t2[i].s;\n }\n // code lengths\n var tr = new u16(maxSym + 1);\n // max bits in tree\n var mbt = ln(t[i1 - 1], tr, 0);\n if (mbt > mb) {\n // more algorithms from UZIP.js\n // TODO: find out how this code works (debt)\n // ind debt\n var i = 0, dt = 0;\n // left cost\n var lft = mbt - mb, cst = 1 << lft;\n t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n for (; i < s; ++i) {\n var i2_1 = t2[i].s;\n if (tr[i2_1] > mb) {\n dt += cst - (1 << (mbt - tr[i2_1]));\n tr[i2_1] = mb;\n }\n else\n break;\n }\n dt >>>= lft;\n while (dt > 0) {\n var i2_2 = t2[i].s;\n if (tr[i2_2] < mb)\n dt -= 1 << (mb - tr[i2_2]++ - 1);\n else\n ++i;\n }\n for (; i >= 0 && dt; --i) {\n var i2_3 = t2[i].s;\n if (tr[i2_3] == mb) {\n --tr[i2_3];\n ++dt;\n }\n }\n mbt = mb;\n }\n return [new u8(tr), mbt];\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n return n.s == -1\n ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n var s = c.length;\n // Note that the semicolon was intentional\n while (s && !c[--s])\n ;\n var cl = new u16(++s);\n // ind num streak\n var cli = 0, cln = c[0], cls = 1;\n var w = function (v) { cl[cli++] = v; };\n for (var i = 1; i <= s; ++i) {\n if (c[i] == cln && i != s)\n ++cls;\n else {\n if (!cln && cls > 2) {\n for (; cls > 138; cls -= 138)\n w(32754);\n if (cls > 2) {\n w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n cls = 0;\n }\n }\n else if (cls > 3) {\n w(cln), --cls;\n for (; cls > 6; cls -= 6)\n w(8304);\n if (cls > 2)\n w(((cls - 3) << 5) | 8208), cls = 0;\n }\n while (cls--)\n w(cln);\n cls = 1;\n cln = c[i];\n }\n }\n return [cl.subarray(0, cli), s];\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n var l = 0;\n for (var i = 0; i < cl.length; ++i)\n l += cf[i] * cl[i];\n return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n // no need to write 00 as type: TypedArray defaults to 0\n var s = dat.length;\n var o = shft(pos + 2);\n out[o] = s & 255;\n out[o + 1] = s >>> 8;\n out[o + 2] = out[o] ^ 255;\n out[o + 3] = out[o + 1] ^ 255;\n for (var i = 0; i < s; ++i)\n out[o + i + 4] = dat[i];\n return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n wbits(out, p++, final);\n ++lf[256];\n var _a = hTree(lf, 15), dlt = _a[0], mlb = _a[1];\n var _b = hTree(df, 15), ddt = _b[0], mdb = _b[1];\n var _c = lc(dlt), lclt = _c[0], nlc = _c[1];\n var _d = lc(ddt), lcdt = _d[0], ndc = _d[1];\n var lcfreq = new u16(19);\n for (var i = 0; i < lclt.length; ++i)\n lcfreq[lclt[i] & 31]++;\n for (var i = 0; i < lcdt.length; ++i)\n lcfreq[lcdt[i] & 31]++;\n var _e = hTree(lcfreq, 7), lct = _e[0], mlcb = _e[1];\n var nlcc = 19;\n for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n ;\n var flen = (bl + 5) << 3;\n var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + (2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18]);\n if (flen <= ftlen && flen <= dtlen)\n return wfblk(out, p, dat.subarray(bs, bs + bl));\n var lm, ll, dm, dl;\n wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n if (dtlen < ftlen) {\n lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n var llm = hMap(lct, mlcb, 0);\n wbits(out, p, nlc - 257);\n wbits(out, p + 5, ndc - 1);\n wbits(out, p + 10, nlcc - 4);\n p += 14;\n for (var i = 0; i < nlcc; ++i)\n wbits(out, p + 3 * i, lct[clim[i]]);\n p += 3 * nlcc;\n var lcts = [lclt, lcdt];\n for (var it = 0; it < 2; ++it) {\n var clct = lcts[it];\n for (var i = 0; i < clct.length; ++i) {\n var len = clct[i] & 31;\n wbits(out, p, llm[len]), p += lct[len];\n if (len > 15)\n wbits(out, p, (clct[i] >>> 5) & 127), p += clct[i] >>> 12;\n }\n }\n }\n else {\n lm = flm, ll = flt, dm = fdm, dl = fdt;\n }\n for (var i = 0; i < li; ++i) {\n if (syms[i] > 255) {\n var len = (syms[i] >>> 18) & 31;\n wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n if (len > 7)\n wbits(out, p, (syms[i] >>> 23) & 31), p += fleb[len];\n var dst = syms[i] & 31;\n wbits16(out, p, dm[dst]), p += dl[dst];\n if (dst > 3)\n wbits16(out, p, (syms[i] >>> 5) & 8191), p += fdeb[dst];\n }\n else {\n wbits16(out, p, lm[syms[i]]), p += ll[syms[i]];\n }\n }\n wbits16(out, p, lm[256]);\n return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new u32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, lst) {\n var s = dat.length;\n var o = new u8(pre + s + 5 * (1 + Math.floor(s / 7000)) + post);\n // writing to this writes to the output buffer\n var w = o.subarray(pre, o.length - post);\n var pos = 0;\n if (!lvl || s < 8) {\n for (var i = 0; i <= s; i += 65535) {\n // end\n var e = i + 65535;\n if (e < s) {\n // write full block\n pos = wfblk(w, pos, dat.subarray(i, e));\n }\n else {\n // write final block\n w[i] = lst;\n pos = wfblk(w, pos, dat.subarray(i, s));\n }\n }\n }\n else {\n var opt = deo[lvl - 1];\n var n = opt >>> 13, c = opt & 8191;\n var msk_1 = (1 << plvl) - 1;\n // prev 2-byte val map curr 2-byte val map\n var prev = new u16(32768), head = new u16(msk_1 + 1);\n var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n // 24576 is an arbitrary number of maximum symbols per block\n // 424 buffer for last block\n var syms = new u32(25000);\n // length/literal freq distance freq\n var lf = new u16(288), df = new u16(32);\n // l/lcnt exbits index l/lind waitdx bitpos\n var lc_1 = 0, eb = 0, i = 0, li = 0, wi = 0, bs = 0;\n for (; i < s; ++i) {\n // hash value\n var hv = hsh(i);\n // index mod 32768\n var imod = i & 32767;\n // previous index with this value\n var pimod = head[hv];\n prev[imod] = pimod;\n head[hv] = imod;\n // We always should modify head and prev, but only add symbols if\n // this data is not yet processed (\"wait\" for wait index)\n if (wi <= i) {\n // bytes remaining\n var rem = s - i;\n if ((lc_1 > 7000 || li > 24576) && rem > 423) {\n pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n li = lc_1 = eb = 0, bs = i;\n for (var j = 0; j < 286; ++j)\n lf[j] = 0;\n for (var j = 0; j < 30; ++j)\n df[j] = 0;\n }\n // len dist chain\n var l = 2, d = 0, ch_1 = c, dif = (imod - pimod) & 32767;\n if (rem > 2 && hv == hsh(i - dif)) {\n var maxn = Math.min(n, rem) - 1;\n var maxd = Math.min(32767, i);\n // max possible length\n // not capped at dif because decompressors implement \"rolling\" index population\n var ml = Math.min(258, rem);\n while (dif <= maxd && --ch_1 && imod != pimod) {\n if (dat[i + l] == dat[i + l - dif]) {\n var nl = 0;\n for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n ;\n if (nl > l) {\n l = nl, d = dif;\n // break out early when we reach \"nice\" (we are satisfied enough)\n if (nl > maxn)\n break;\n // now, find the rarest 2-byte sequence within this\n // length of literals and search for that instead.\n // Much faster than just using the start\n var mmd = Math.min(dif, nl - 2);\n var md = 0;\n for (var j = 0; j < mmd; ++j) {\n var ti = (i - dif + j + 32768) & 32767;\n var pti = prev[ti];\n var cd = (ti - pti + 32768) & 32767;\n if (cd > md)\n md = cd, pimod = ti;\n }\n }\n }\n // check the previous match\n imod = pimod, pimod = prev[imod];\n dif += (imod - pimod + 32768) & 32767;\n }\n }\n // d will be nonzero only when a match was found\n if (d) {\n // store both dist and len data in one Uint32\n // Make sure this is recognized as a len/dist with 28th bit (2^28)\n syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n var lin = revfl[l] & 31, din = revfd[d] & 31;\n eb += fleb[lin] + fdeb[din];\n ++lf[257 + lin];\n ++df[din];\n wi = i + l;\n ++lc_1;\n }\n else {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n }\n }\n pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n // this is the easiest way to avoid needing to maintain state\n if (!lst)\n pos = wfblk(w, pos, et);\n }\n return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n var t = new u32(256);\n for (var i = 0; i < 256; ++i) {\n var c = i, k = 9;\n while (--k)\n c = ((c & 1) && 0xEDB88320) ^ (c >>> 1);\n t[i] = c;\n }\n return t;\n})();\n// CRC32\nvar crc = function () {\n var c = 0xFFFFFFFF;\n return {\n p: function (d) {\n // closures have awful performance\n var cr = c;\n for (var i = 0; i < d.length; ++i)\n cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n c = cr;\n },\n d: function () { return c ^ 0xFFFFFFFF; }\n };\n};\n// Alder32\nvar adler = function () {\n var a = 1, b = 0;\n return {\n p: function (d) {\n // closures have awful performance\n var n = a, m = b;\n var l = d.length;\n for (var i = 0; i != l;) {\n var e = Math.min(i + 5552, l);\n for (; i < e; ++i)\n n += d[i], m += n;\n n %= 65521, m %= 65521;\n }\n a = n, b = m;\n },\n d: function () { return ((a >>> 8) << 16 | (b & 255) << 8 | (b >>> 8)) + ((a & 255) << 23) * 2; }\n };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : (12 + opt.mem), pre, post, !st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n var o = {};\n for (var k in a)\n o[k] = a[k];\n for (var k in b)\n o[k] = b[k];\n return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n var dt = fn();\n var st = fn.toString();\n var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/ /g, '').split(',');\n for (var i = 0; i < dt.length; ++i) {\n var v = dt[i], k = ks[i];\n if (typeof v == 'function') {\n fnStr += ';' + k + '=';\n var st_1 = v.toString();\n if (v.prototype) {\n // for global objects\n if (st_1.indexOf('[native code]') != -1) {\n var spInd = st_1.indexOf(' ', 8) + 1;\n fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n }\n else {\n fnStr += st_1;\n for (var t in v.prototype)\n fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n }\n }\n else\n fnStr += st_1;\n }\n else\n td[k] = v;\n }\n return [fnStr, td];\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n var tl = [];\n for (var k in v) {\n if (v[k] instanceof u8 || v[k] instanceof u16 || v[k] instanceof u32)\n tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n }\n return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n var _a;\n if (!ch[id]) {\n var fnStr = '', td_1 = {}, m = fns.length - 1;\n for (var i = 0; i < m; ++i)\n _a = wcln(fns[i], fnStr, td_1), fnStr = _a[0], td_1 = _a[1];\n ch[id] = wcln(fns[m], fnStr, td_1);\n }\n var td = mrg({}, ch[id][1]);\n return wk(ch[id][0] + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, u32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, hMap, max, bits, bits16, shft, slc, inflt, inflateSync, pbf, gu8]; };\nvar bDflt = function () { return [u8, u16, u32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zlv]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get u8\nvar gu8 = function (o) { return o && o.size && new u8(o.size); };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n var w = wrkr(fns, init, id, function (err, dat) {\n w.terminate();\n cb(err, dat);\n });\n if (!opts.consume)\n dat = new u8(dat);\n w.postMessage([dat, opts], [dat.buffer]);\n return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n return function (ev) { return strm.push(ev.data[0], ev.data[1]); };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id) {\n var t;\n var w = wrkr(fns, init, id, function (err, dat) {\n if (err)\n w.terminate(), strm.ondata.call(strm, err);\n else {\n if (dat[1])\n w.terminate();\n strm.ondata.call(strm, err, dat[0], dat[1]);\n }\n });\n w.postMessage(opts);\n strm.push = function (d, f) {\n if (t)\n throw 'stream finished';\n if (!strm.ondata)\n throw 'no stream handler';\n w.postMessage([d, t = f], [d.buffer]);\n };\n strm.terminate = function () { w.terminate(); };\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16)) + (d[b + 3] << 23) * 2; };\n// write bytes\nvar wbytes = function (d, b, v) {\n for (; v; ++b)\n d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n var fn = o.filename;\n c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n if (o.mtime != 0)\n wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n if (fn) {\n c[3] = 8;\n for (var i = 0; i <= fn.length; ++i)\n c[i + 10] = fn.charCodeAt(i);\n }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n throw 'invalid gzip data';\n var flg = d[3];\n var st = 10;\n if (flg & 4)\n st += d[10] | (d[11] << 8) + 2;\n for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n ;\n return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n var l = d.length;\n return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16) + (2 * (d[l - 1] << 23));\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + ((o.filename && (o.filename.length + 1)) || 0); };\n// zlib header\nvar zlh = function (c, o) {\n var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n c[0] = 120, c[1] = (fl << 6) | (fl ? (32 - 2 * fl) : 1);\n};\n// zlib valid\nvar zlv = function (d) {\n if ((d[0] & 15) != 8 || (d[0] >>> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n throw 'invalid zlib data';\n if (d[1] & 32)\n throw 'invalid zlib data: preset dictionaries not supported';\n};\nfunction AsyncCmpStrm(opts, cb) {\n if (!cb && typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n return opts;\n}\n// zlib footer: -4 to -0 is Adler32\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n function Deflate(opts, cb) {\n if (!cb && typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n this.o = opts || {};\n }\n Deflate.prototype.p = function (c, f) {\n this.ondata(dopt(c, this.o, 0, 0, !f), f);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Deflate.prototype.push = function (chunk, final) {\n if (this.d)\n throw 'stream finished';\n if (!this.ondata)\n throw 'no stream handler';\n this.d = final;\n this.p(chunk, final || false);\n };\n return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n function AsyncDeflate(opts, cb) {\n astrmify([\n bDflt,\n function () { return [astrm, Deflate]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Deflate(ev.data);\n onmessage = astrm(strm);\n }, 6);\n }\n return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bDflt,\n ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n if (opts === void 0) { opts = {}; }\n return dopt(data, opts, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n /**\n * Creates an inflation stream\n * @param cb The callback to call whenever data is inflated\n */\n function Inflate(cb) {\n this.s = {};\n this.p = new u8(0);\n this.ondata = cb;\n }\n Inflate.prototype.e = function (c) {\n if (this.d)\n throw 'stream finished';\n if (!this.ondata)\n throw 'no stream handler';\n var l = this.p.length;\n var n = new u8(l + c.length);\n n.set(this.p), n.set(c, l), this.p = n;\n };\n Inflate.prototype.c = function (final) {\n this.d = this.s.i = final || false;\n var bts = this.s.b;\n var dt = inflt(this.p, this.o, this.s);\n this.ondata(slc(dt, bts, this.s.b), this.d);\n this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n this.p = slc(this.p, (this.s.p / 8) >> 0), this.s.p &= 7;\n };\n /**\n * Pushes a chunk to be inflated\n * @param chunk The chunk to push\n * @param final Whether this is the final chunk\n */\n Inflate.prototype.push = function (chunk, final) {\n this.e(chunk), this.c(final);\n };\n return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous inflation stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncInflate(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n function () { return [astrm, Inflate]; }\n ], this, 0, function () {\n var strm = new Inflate();\n onmessage = astrm(strm);\n }, 7);\n }\n return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bInflt\n ], function (ev) { return pbf(inflateSync(ev.data[0], gu8(ev.data[1]))); }, 1, cb);\n}\n/**\n * Expands DEFLATE data with no wrapper\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function inflateSync(data, out) {\n return inflt(data, out);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n function Gzip(opts, cb) {\n this.c = crc();\n this.l = 0;\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gzip.prototype.push = function (chunk, final) {\n Deflate.prototype.push.call(this, chunk, final);\n };\n Gzip.prototype.p = function (c, f) {\n this.c.p(c);\n this.l += c.length;\n var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, !f);\n if (this.v)\n gzh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n this.ondata(raw, f);\n };\n return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n function AsyncGzip(opts, cb) {\n astrmify([\n bDflt,\n gze,\n function () { return [astrm, Deflate, Gzip]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Gzip(ev.data);\n onmessage = astrm(strm);\n }, 8);\n }\n return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bDflt,\n gze,\n function () { return [gzipSync]; }\n ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n if (opts === void 0) { opts = {}; }\n var c = crc(), l = data.length;\n c.p(data);\n var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n /**\n * Creates a GUNZIP stream\n * @param cb The callback to call whenever data is inflated\n */\n function Gunzip(cb) {\n this.v = 1;\n Inflate.call(this, cb);\n }\n /**\n * Pushes a chunk to be GUNZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gunzip.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n var s = gzs(this.p);\n if (s >= this.p.length && !final)\n return;\n this.p = this.p.subarray(s), this.v = 0;\n }\n if (final) {\n if (this.p.length < 8)\n throw 'invalid gzip stream';\n this.p = this.p.subarray(0, -8);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous GUNZIP stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncGunzip(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n guze,\n function () { return [astrm, Inflate, Gunzip]; }\n ], this, 0, function () {\n var strm = new Gunzip();\n onmessage = astrm(strm);\n }, 9);\n }\n return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bInflt,\n guze,\n function () { return [gunzipSync]; }\n ], function (ev) { return pbf(gunzipSync(ev.data[0])); }, 3, cb);\n}\n/**\n * Expands GZIP data\n * @param data The data to decompress\n * @param out Where to write the data. GZIP already encodes the output size, so providing this doesn't save memory.\n * @returns The decompressed version of the data\n */\nexport function gunzipSync(data, out) {\n return inflt(data.subarray(gzs(data), -8), out || new u8(gzl(data)));\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n function Zlib(opts, cb) {\n this.c = adler();\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be zlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Zlib.prototype.push = function (chunk, final) {\n Deflate.prototype.push.call(this, chunk, final);\n };\n Zlib.prototype.p = function (c, f) {\n this.c.p(c);\n var raw = dopt(c, this.o, this.v && 2, f && 4, !f);\n if (this.v)\n zlh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 4, this.c.d());\n this.ondata(raw, f);\n };\n return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n function AsyncZlib(opts, cb) {\n astrmify([\n bDflt,\n zle,\n function () { return [astrm, Deflate, Zlib]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Zlib(ev.data);\n onmessage = astrm(strm);\n }, 10);\n }\n return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bDflt,\n zle,\n function () { return [zlibSync]; }\n ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n if (opts === void 0) { opts = {}; }\n var a = adler();\n a.p(data);\n var d = dopt(data, opts, 2, 4);\n return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n /**\n * Creates a Zlib decompression stream\n * @param cb The callback to call whenever data is inflated\n */\n function Unzlib(cb) {\n this.v = 1;\n Inflate.call(this, cb);\n }\n /**\n * Pushes a chunk to be unzlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzlib.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n if (this.p.length < 2 && !final)\n return;\n this.p = this.p.subarray(2), this.v = 0;\n }\n if (final) {\n if (this.p.length < 4)\n throw 'invalid zlib stream';\n this.p = this.p.subarray(0, -4);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous Zlib decompression stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncUnzlib(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n zule,\n function () { return [astrm, Inflate, Unzlib]; }\n ], this, 0, function () {\n var strm = new Unzlib();\n onmessage = astrm(strm);\n }, 11);\n }\n return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bInflt,\n zule,\n function () { return [unzlibSync]; }\n ], function (ev) { return pbf(unzlibSync(ev.data[0], gu8(ev.data[1]))); }, 5, cb);\n}\n/**\n * Expands Zlib data\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function unzlibSync(data, out) {\n return inflt((zlv(data), data.subarray(2, -4)), out);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n /**\n * Creates a decompression stream\n * @param cb The callback to call whenever data is decompressed\n */\n function Decompress(cb) {\n this.G = Gunzip;\n this.I = Inflate;\n this.Z = Unzlib;\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Decompress.prototype.push = function (chunk, final) {\n if (!this.ondata)\n throw 'no stream handler';\n if (!this.s) {\n if (this.p && this.p.length) {\n var n = new u8(this.p.length + chunk.length);\n n.set(this.p), n.set(chunk, this.p.length);\n }\n else\n this.p = chunk;\n if (this.p.length > 2) {\n var _this_1 = this;\n var cb = function () { _this_1.ondata.apply(_this_1, arguments); };\n this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n ? new this.G(cb)\n : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n ? new this.I(cb)\n : new this.Z(cb);\n this.s.push(this.p, final);\n this.p = null;\n }\n }\n else\n this.s.push(chunk, final);\n };\n return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous decompression stream\n * @param cb The callback to call whenever data is decompressed\n */\n function AsyncDecompress(cb) {\n this.G = AsyncGunzip;\n this.I = AsyncInflate;\n this.Z = AsyncUnzlib;\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncDecompress.prototype.push = function (chunk, final) {\n Decompress.prototype.push.call(this, chunk, final);\n };\n return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzip(data, opts, cb)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflate(data, opts, cb)\n : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, out) {\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzipSync(data, out)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflateSync(data, out)\n : unzlibSync(data, out);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n for (var k in d) {\n var val = d[k], n = p + k;\n if (val instanceof u8)\n t[n] = [val, o];\n else if (Array.isArray(val))\n t[n] = [val[0], mrg(o, val[1])];\n else\n fltn(val, n + '/', t, o);\n }\n};\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n var l = str.length;\n if (!latin1 && typeof TextEncoder != 'undefined')\n return new TextEncoder().encode(str);\n var ar = new u8(str.length + (str.length >>> 1));\n var ai = 0;\n var w = function (v) { ar[ai++] = v; };\n for (var i = 0; i < l; ++i) {\n if (ai + 5 > ar.length) {\n var n = new u8(ai + 8 + ((l - i) << 1));\n n.set(ar);\n ar = n;\n }\n var c = str.charCodeAt(i);\n if (c < 128 || latin1)\n w(c);\n else if (c < 2048)\n w(192 | (c >>> 6)), w(128 | (c & 63));\n else if (c > 55295 && c < 57344)\n c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n w(240 | (c >>> 18)), w(128 | ((c >>> 12) & 63)), w(128 | ((c >>> 6) & 63)), w(128 | (c & 63));\n else\n w(224 | (c >>> 12)), w(128 | ((c >>> 6) & 63)), w(128 | (c & 63));\n }\n return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n var r = '';\n if (!latin1 && typeof TextDecoder != 'undefined')\n return new TextDecoder().decode(dat);\n for (var i = 0; i < dat.length;) {\n var c = dat[i++];\n if (c < 128 || latin1)\n r += String.fromCharCode(c);\n else if (c < 224)\n r += String.fromCharCode((c & 31) << 6 | (dat[i++] & 63));\n else if (c < 240)\n r += String.fromCharCode((c & 15) << 12 | (dat[i++] & 63) << 6 | (dat[i++] & 63));\n else\n c = ((c & 15) << 18 | (dat[i++] & 63) << 12 | (dat[i++] & 63) << 6 | (dat[i++] & 63)) - 65536,\n r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n }\n return r;\n}\n;\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n var fnl = b2(d, b + 28), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl;\n var _a = z ? z64e(d, es) : [b4(d, b + 20), b4(d, b + 24), b4(d, b + 42)], sc = _a[0], su = _a[1], off = _a[2];\n return [b2(d, b + 10), sc, su, fn, es + b2(d, b + 30) + b2(d, b + 32), off];\n};\n// read zip64 extra field\nvar z64e = function (d, b) {\n for (; b2(d, b) != 1; b += 4 + b2(d, b + 2))\n ;\n return [b4(d, b + 12), b4(d, b + 4), b4(d, b + 20)];\n};\n// write zip header\nvar wzh = function (d, b, c, cmp, su, fn, u, o, ce, t) {\n var fl = fn.length, l = cmp.length;\n wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n if (ce != null)\n d[b] = 20, b += 2;\n d[b] = 20, b += 2; // spec compliance? what's that?\n d[b++] = (t == 8 && (o.level == 1 ? 6 : o.level < 6 ? 4 : o.level == 9 ? 2 : 0)), d[b++] = u && 8;\n d[b] = t, b += 2;\n var dt = new Date(o.mtime || Date.now()), y = dt.getFullYear() - 1980;\n if (y < 0 || y > 119)\n throw 'date not in range 1980-2099';\n wbytes(d, b, ((y << 24) * 2) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >>> 1));\n b += 4;\n wbytes(d, b, c);\n wbytes(d, b + 4, l);\n wbytes(d, b + 8, su);\n wbytes(d, b + 12, fl), b += 16; // skip extra field, comment\n if (ce != null)\n wbytes(d, b += 10, ce), b += 4;\n d.set(fn, b);\n b += fl;\n if (ce == null)\n d.set(cmp, b);\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n wbytes(o, b, 0x6054B50); // skip disk\n wbytes(o, b + 8, c);\n wbytes(o, b + 10, c);\n wbytes(o, b + 12, d);\n wbytes(o, b + 16, e);\n};\nexport function zip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n var r = {};\n fltn(data, '', r, opts);\n var k = Object.keys(r);\n var lft = k.length, o = 0, tot = 0;\n var slft = lft, files = new Array(lft);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var cbf = function () {\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n tot = 0;\n for (var i = 0; i < slft; ++i) {\n var f = files[i];\n try {\n wzh(out, tot, f.c, f.d, f.m, f.n, f.u, f.p, null, f.t);\n wzh(out, o, f.c, f.d, f.m, f.n, f.u, f.p, tot, f.t), o += 46 + f.n.length, tot += 30 + f.n.length + f.d.length;\n }\n catch (e) {\n return cb(e, null);\n }\n }\n wzf(out, o, files.length, cdl, oe);\n cb(null, out);\n };\n if (!lft)\n cbf();\n var _loop_1 = function (i) {\n var fn = k[i];\n var _a = r[fn], file = _a[0], p = _a[1];\n var c = crc(), m = file.length;\n c.p(file);\n var n = strToU8(fn), s = n.length;\n var t = p.level == 0 ? 0 : 8;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cb(e, null);\n }\n else {\n var l = d.length;\n files[i] = {\n t: t,\n d: d,\n m: m,\n c: c.d(),\n u: fn.length != l,\n n: n,\n p: p\n };\n o += 30 + s + l;\n tot += 76 + 2 * s + l;\n if (!--lft)\n cbf();\n }\n };\n if (n.length > 65535)\n cbl('filename too long', null);\n if (!t)\n cbl(null, file);\n else if (m < 160000) {\n try {\n cbl(null, deflateSync(file, p));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(deflate(file, p, cbl));\n };\n // Cannot use lft because it can decrease\n for (var i = 0; i < slft; ++i) {\n _loop_1(i);\n }\n return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n if (opts === void 0) { opts = {}; }\n var r = {};\n var files = [];\n fltn(data, '', r, opts);\n var o = 0;\n var tot = 0;\n for (var fn in r) {\n var _a = r[fn], file = _a[0], p = _a[1];\n var t = p.level == 0 ? 0 : 8;\n var n = strToU8(fn), s = n.length;\n if (n.length > 65535)\n throw 'filename too long';\n var d = t ? deflateSync(file, p) : file, l = d.length;\n var c = crc();\n c.p(file);\n files.push({\n t: t,\n d: d,\n m: file.length,\n c: c.d(),\n u: fn.length != s,\n n: n,\n o: o,\n p: p\n });\n o += 30 + s + l;\n tot += 76 + 2 * s + l;\n }\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n for (var i = 0; i < files.length; ++i) {\n var f = files[i];\n wzh(out, f.o, f.c, f.d, f.m, f.n, f.u, f.p, null, f.t);\n wzh(out, o, f.c, f.d, f.m, f.n, f.u, f.p, f.o, f.t), o += 46 + f.n.length;\n }\n wzf(out, o, files.length, cdl, oe);\n return out;\n}\n/**\n * Asynchronously decompresses a ZIP archive\n * @param data The raw compressed ZIP file\n * @param cb The callback to call with the decompressed files\n * @returns A function that can be used to immediately terminate the unzipping\n */\nexport function unzip(data, cb) {\n if (typeof cb != 'function')\n throw 'no callback';\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558) {\n cb('invalid zip file', null);\n return;\n }\n }\n ;\n var lft = b2(data, e + 8);\n if (!lft)\n cb(null, {});\n var c = lft;\n var o = b4(data, e + 16);\n var z = o == 4294967295;\n if (z) {\n e = b4(data, e - 12);\n if (b4(data, e) != 0x6064B50)\n throw 'invalid zip file';\n c = lft = b4(data, e + 32);\n o = b4(data, e + 48);\n }\n var _loop_2 = function (i) {\n var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cb(e, null);\n }\n else {\n files[fn] = d;\n if (!--lft)\n cb(null, files);\n }\n };\n if (!c_1)\n cbl(null, slc(data, b, b + sc));\n else if (c_1 == 8) {\n var infl = data.subarray(b, b + sc);\n if (sc < 320000) {\n try {\n cbl(null, inflateSync(infl, new u8(su)));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(inflate(infl, { size: su }, cbl));\n }\n else\n cbl('unknown compression type ' + c_1, null);\n };\n for (var i = 0; i < c; ++i) {\n _loop_2(i);\n }\n return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @returns The decompressed files\n */\nexport function unzipSync(data) {\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558)\n throw 'invalid zip file';\n }\n ;\n var c = b2(data, e + 8);\n if (!c)\n return {};\n var o = b4(data, e + 16);\n var z = o == 4294967295;\n if (z) {\n e = b4(data, e - 12);\n if (b4(data, e) != 0x6064B50)\n throw 'invalid zip file';\n c = b4(data, e + 32);\n o = b4(data, e + 48);\n }\n for (var i = 0; i < c; ++i) {\n var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n if (!c_2)\n files[fn] = slc(data, b, b + sc);\n else if (c_2 == 8)\n files[fn] = inflateSync(data.subarray(b, b + sc), new u8(su));\n else\n throw 'unknown compression type ' + c_2;\n }\n return files;\n}\n", "import type { MaskInputOptions, SlimDOMOptions } from 'rrweb-snapshot'\nimport { PostHog } from './posthog-core'\nimport { CaptureMetrics } from './capture-metrics'\nimport { RetryQueue } from './retry-queue'\n\nexport type Property = any\nexport type Properties = Record\nexport interface CaptureResult {\n event: string\n properties: Properties\n $set?: Properties\n timestamp?: Date\n}\nexport type CaptureCallback = (response: any, data: any) => void\n\nexport type AutocaptureCompatibleElement = 'a' | 'button' | 'form' | 'input' | 'select' | 'textarea' | 'label'\nexport type DomAutocaptureEvents = 'click' | 'change' | 'submit'\n\n/**\n * If an array is passed for an allowlist, autocapture events will only be sent for elements matching\n * at least one of the elements in the array. Multiple allowlists can be used\n */\nexport interface AutocaptureConfig {\n /**\n * List of URLs to allow autocapture on, can be strings to match\n * or regexes e.g. ['https://example.com', 'test.com/.*']\n */\n url_allowlist?: (string | RegExp)[]\n\n /**\n * List of DOM events to allow autocapture on e.g. ['click', 'change', 'submit']\n */\n dom_event_allowlist?: DomAutocaptureEvents[]\n\n /**\n * List of DOM elements to allow autocapture on\n * e.g. ['a', 'button', 'form', 'input', 'select', 'textarea', 'label']\n */\n element_allowlist?: AutocaptureCompatibleElement[]\n\n /**\n * List of CSS selectors to allow autocapture on\n * e.g. ['[ph-capture]']\n */\n css_selector_allowlist?: string[]\n}\n\nexport interface PostHogConfig {\n api_host: string\n api_method: string\n api_transport: string\n ui_host: string | null\n token: string\n autocapture: boolean | AutocaptureConfig\n rageclick: boolean\n cross_subdomain_cookie: boolean\n persistence: 'localStorage' | 'cookie' | 'memory' | 'localStorage+cookie'\n persistence_name: string\n cookie_name: string\n loaded: (posthog_instance: PostHog) => void\n store_google: boolean\n save_referrer: boolean\n test: boolean\n verbose: boolean\n img: boolean\n capture_pageview: boolean\n capture_pageleave: boolean\n debug: boolean\n cookie_expiration: number\n upgrade: boolean\n disable_session_recording: boolean\n disable_persistence: boolean\n disable_cookie: boolean\n enable_recording_console_log?: boolean\n secure_cookie: boolean\n ip: boolean\n opt_out_capturing_by_default: boolean\n opt_out_persistence_by_default: boolean\n opt_out_capturing_persistence_type: 'localStorage' | 'cookie'\n opt_out_capturing_cookie_prefix: string | null\n opt_in_site_apps: boolean\n respect_dnt: boolean\n property_blacklist: string[]\n xhr_headers: { [header_name: string]: string }\n on_xhr_error: (failedRequest: XMLHttpRequest) => void\n inapp_protocol: string\n inapp_link_new_window: boolean\n request_batching: boolean\n sanitize_properties: ((properties: Properties, event_name: string) => Properties) | null\n properties_string_max_length: number\n session_recording: SessionRecordingOptions\n mask_all_element_attributes: boolean\n mask_all_text: boolean\n advanced_disable_decide: boolean\n advanced_disable_toolbar_metrics: boolean\n get_device_id: (uuid: string) => string\n name: string\n callback_fn: string\n _onCapture: (eventName: string, eventData: CaptureResult) => void\n _capture_metrics: boolean\n capture_performance?: boolean\n // Should only be used for testing. Could negatively impact performance.\n disable_compression: boolean\n bootstrap: {\n distinctID?: string\n isIdentifiedID?: boolean\n featureFlags?: Record\n featureFlagPayloads?: Record\n }\n segment?: any\n}\n\nexport interface OptInOutCapturingOptions {\n capture: (event: string, properties: Properties, options: CaptureOptions) => void\n capture_event_name: string\n capture_properties: Properties\n enable_persistence: boolean\n clear_persistence: boolean\n persistence_type: string\n cookie_prefix: string\n cookie_expiration: number\n cross_subdomain_cookie: boolean\n secure_cookie: boolean\n}\n\nexport interface isFeatureEnabledOptions {\n send_event: boolean\n}\n\nexport interface SessionRecordingOptions {\n blockClass?: string | RegExp\n blockSelector?: string | null\n ignoreClass?: string\n maskAllInputs?: boolean\n maskInputOptions?: MaskInputOptions\n maskInputFn?: ((text: string) => string) | null\n slimDOMOptions?: SlimDOMOptions | 'all' | true\n collectFonts?: boolean\n inlineStylesheet?: boolean\n recorderVersion?: 'v1' | 'v2'\n}\n\nexport enum Compression {\n GZipJS = 'gzip-js',\n LZ64 = 'lz64',\n Base64 = 'base64',\n}\n\nexport interface XHROptions {\n transport?: 'XHR' | 'sendBeacon'\n method?: 'POST' | 'GET'\n urlQueryArgs?: { compression: Compression }\n verbose?: boolean\n blob?: boolean\n sendBeacon?: boolean\n}\n\nexport interface CaptureOptions extends XHROptions {\n $set?: Properties /** used with $identify */\n $set_once?: Properties /** used with $identify */\n _batchKey?: string /** key of queue, e.g. 'sessionRecording' vs 'event' */\n _metrics?: Properties\n _noTruncate?: boolean /** if set, overrides and disables config.properties_string_max_length */\n endpoint?: string /** defaults to '/e/' */\n send_instantly?: boolean /** if set skips the batched queue */\n timestamp?: Date\n}\n\nexport interface RetryQueueElement {\n retryAt: Date\n requestData: QueuedRequestData\n}\nexport interface QueuedRequestData {\n url: string\n data: Properties\n options: CaptureOptions\n headers?: Properties\n callback?: RequestCallback\n retriesPerformedSoFar?: number\n}\n\nexport interface XHRParams extends QueuedRequestData {\n captureMetrics: CaptureMetrics\n retryQueue: RetryQueue\n onXHRError: (req: XMLHttpRequest) => void\n timeout?: number\n}\n\nexport interface DecideResponse {\n status: number\n supportedCompression: Compression[]\n config: {\n enable_collect_everything: boolean\n }\n custom_properties: AutoCaptureCustomProperty[] // TODO: delete, not sent\n featureFlags: Record\n featureFlagPayloads: Record\n errorsWhileComputingFlags: boolean\n capturePerformance?: boolean\n sessionRecording?: {\n endpoint?: string\n consoleLogRecordingEnabled?: boolean\n recorderVersion?: 'v1' | 'v2'\n }\n toolbarParams: ToolbarParams\n editorParams?: ToolbarParams /** @deprecated, renamed to toolbarParams, still present on older API responses */\n toolbarVersion: 'toolbar' /** @deprecated, moved to toolbarParams */\n isAuthenticated: boolean\n siteApps: { id: number; url: string }[]\n}\n\nexport type FeatureFlagsCallback = (flags: string[], variants: Record) => void\n\n// TODO: delete custom_properties after changeless typescript refactor\nexport interface AutoCaptureCustomProperty {\n name: string\n css_selector: string\n event_selectors: string[]\n}\n\nexport interface CompressionData {\n data: string\n compression?: Compression\n}\n\nexport interface GDPROptions {\n capture?: (\n event: string,\n properties: Properties,\n options: CaptureOptions\n ) => void /** function used for capturing a PostHog event to record the opt-in action */\n captureEventName?: string /** event name to be used for capturing the opt-in action */\n captureProperties?: Properties /** set of properties to be captured along with the opt-in action */\n persistenceType?: string /** persistence mechanism used - cookie or localStorage */\n persistencePrefix?: string /** [__ph_opt_in_out] - custom prefix to be used in the cookie/localstorage name */\n cookieExpiration?: number /** number of days until the opt-in cookie expires */\n crossSubdomainCookie?: boolean /** whether the opt-in cookie is set as cross-subdomain or not */\n secureCookie?: boolean /** whether the opt-in cookie is set as secure or not */\n respectDnt?: boolean\n window?: Window\n}\n\nexport type RequestCallback = (response: Record, data?: Properties) => void\n\nexport interface PersistentStore {\n is_supported: () => boolean\n error: (error: any) => void\n parse: (name: string) => any\n get: (name: string) => any\n set: (name: string, value: any, expire_days?: number | null, cross_subdomain?: boolean, secure?: boolean) => void\n remove: (name: string, cross_subdomain?: boolean) => void\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport type Breaker = {}\nexport type EventHandler = (event: Event) => boolean | void\n\nexport type ToolbarUserIntent = 'add-action' | 'edit-action'\nexport type ToolbarSource = 'url' | 'localstorage'\nexport type ToolbarVersion = 'toolbar'\n\n/* sync with posthog */\nexport interface ToolbarParams {\n apiURL?: string\n jsURL?: string\n token?: string /** public posthog-js token */\n temporaryToken?: string /** private temporary user token */\n actionId?: number\n userIntent?: ToolbarUserIntent\n source?: ToolbarSource\n toolbarVersion?: ToolbarVersion\n instrument?: boolean\n distinctId?: string\n userEmail?: string\n dataAttributes?: string[]\n featureFlags?: Record\n}\n\nexport interface PostData {\n buffer?: BlobPart\n compression?: Compression\n data?: string\n}\n\nexport interface JSC {\n (): void\n [key: string]: (response: any) => void\n}\n\nexport type SnippetArrayItem = [method: string, ...args: any[]]\n\nexport type JsonType = string | number | boolean | null | { [key: string]: JsonType } | Array\n", "import { _each, _HTTPBuildQuery, logger } from './utils'\nimport Config from './config'\nimport { PostData, XHROptions, XHRParams } from './types'\n\nexport const addParamsToURL = (\n url: string,\n urlQueryArgs: Record | undefined,\n parameterOptions: { ip?: boolean }\n): string => {\n const args = urlQueryArgs || {}\n args['ip'] = parameterOptions['ip'] ? 1 : 0\n args['_'] = new Date().getTime().toString()\n args['ver'] = Config.LIB_VERSION\n\n const halves = url.split('?')\n if (halves.length > 1) {\n const params = halves[1].split('&')\n for (const p of params) {\n const key = p.split('=')[0]\n if (args[key]) {\n delete args[key]\n }\n }\n }\n\n const argSeparator = url.indexOf('?') > -1 ? '&' : '?'\n return url + argSeparator + _HTTPBuildQuery(args)\n}\n\nexport const encodePostData = (data: PostData | Uint8Array, options: Partial): string | BlobPart | null => {\n if (options.blob && data.buffer) {\n return new Blob([data.buffer], { type: 'text/plain' })\n }\n\n if (options.sendBeacon || options.blob) {\n const body = encodePostData(data, { method: 'POST' }) as BlobPart\n return new Blob([body], { type: 'application/x-www-form-urlencoded' })\n }\n\n if (options.method !== 'POST') {\n return null\n }\n\n let body_data\n const isUint8Array = (d: unknown): d is Uint8Array => Object.prototype.toString.call(d) === '[object Uint8Array]'\n if (Array.isArray(data) || isUint8Array(data)) {\n // TODO: eh? passing an Array here?\n body_data = 'data=' + encodeURIComponent(data as any)\n } else {\n body_data = 'data=' + encodeURIComponent(data.data as string)\n }\n\n if ('compression' in data && data.compression) {\n body_data += '&compression=' + data.compression\n }\n\n return body_data\n}\n\nexport const xhr = ({\n url,\n data,\n headers,\n options,\n captureMetrics,\n callback,\n retriesPerformedSoFar,\n retryQueue,\n onXHRError,\n timeout = 10000,\n}: XHRParams) => {\n const req = new XMLHttpRequest()\n req.open(options.method || 'GET', url, true)\n\n const body = encodePostData(data, options)\n\n captureMetrics.incr('_send_request')\n captureMetrics.incr('_send_request_inflight')\n\n _each(headers, function (headerValue, headerName) {\n req.setRequestHeader(headerName, headerValue)\n })\n\n if (options.method === 'POST' && !options.blob) {\n req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')\n }\n\n req.timeout = timeout\n // send the ph_optout cookie\n // withCredentials cannot be modified until after calling .open on Android and Mobile Safari\n req.withCredentials = true\n req.onreadystatechange = () => {\n if (req.readyState === 4) {\n captureMetrics.incr(`xhr-response`)\n captureMetrics.incr(`xhr-response-${req.status}`)\n captureMetrics.decr('_send_request_inflight')\n\n // XMLHttpRequest.DONE == 4, except in safari 4\n if (req.status === 200) {\n if (callback) {\n let response\n try {\n response = JSON.parse(req.responseText)\n } catch (e) {\n logger.error(e)\n return\n }\n callback(response)\n }\n } else {\n if (typeof onXHRError === 'function') {\n onXHRError(req)\n }\n\n // don't retry certain errors\n if ([401, 403, 404, 500].indexOf(req.status) < 0) {\n retryQueue.enqueue({\n url,\n data,\n options,\n headers,\n retriesPerformedSoFar: (retriesPerformedSoFar || 0) + 1,\n callback,\n })\n }\n\n if (callback) {\n callback({ status: 0 })\n }\n }\n }\n }\n req.send(body)\n}\n", "import { LZString } from './lz-string'\nimport Config from './config'\nimport {\n logger,\n document,\n userAgent,\n window,\n _isUndefined,\n _extend,\n _each,\n _isObject,\n _isBlockedUA,\n _copyAndTruncateStrings,\n _isArray,\n _safewrap_class,\n _register_event,\n _UUID,\n _info,\n _eachArray,\n} from './utils'\nimport { autocapture } from './autocapture'\nimport { PostHogPeople } from './posthog-people'\nimport { PostHogFeatureFlags } from './posthog-featureflags'\nimport { ALIAS_ID_KEY, PEOPLE_DISTINCT_ID_KEY, PostHogPersistence } from './posthog-persistence'\nimport { SessionRecording } from './extensions/sessionrecording'\nimport { WebPerformanceObserver } from './extensions/web-performance'\nimport { Decide } from './decide'\nimport { Toolbar } from './extensions/toolbar'\nimport { clearOptInOut, hasOptedIn, hasOptedOut, optIn, optOut, userOptedOut } from './gdpr-utils'\nimport { cookieStore, localStore } from './storage'\nimport { RequestQueue } from './request-queue'\nimport { CaptureMetrics } from './capture-metrics'\nimport { compressData, decideCompression } from './compression'\nimport { addParamsToURL, encodePostData, xhr } from './send-request'\nimport { RetryQueue } from './retry-queue'\nimport { SessionIdManager } from './sessionid'\nimport {\n CaptureOptions,\n CaptureResult,\n Compression,\n ToolbarParams,\n GDPROptions,\n isFeatureEnabledOptions,\n JSC,\n OptInOutCapturingOptions,\n PostHogConfig,\n Properties,\n Property,\n RequestCallback,\n SnippetArrayItem,\n XHROptions,\n AutocaptureConfig,\n JsonType,\n} from './types'\nimport { SentryIntegration } from './extensions/sentry-integration'\nimport { createSegmentIntegration } from './extensions/segment-integration'\nimport { PageViewIdManager } from './page-view-id'\n\n/*\nSIMPLE STYLE GUIDE:\n\nthis.x === public function\nthis._x === internal - only use within this file\nthis.__x === private - only use within the class\n\nGlobals should be all caps\n*/\n\nenum InitType {\n INIT_MODULE = 0,\n INIT_SNIPPET = 1,\n}\n\nlet init_type: InitType\n\n// TODO: the type of this is very loose. Sometimes it's also PostHogLib itself\nlet posthog_master: Record & {\n init: (token: string, config: Partial, name: string) => void\n}\n\n// some globals for comparisons\nconst __NOOP = () => {}\nconst __NOOPTIONS = {}\n\nconst PRIMARY_INSTANCE_NAME = 'posthog'\n\n/*\n * Dynamic... constants? Is that an oxymoron?\n */\n// http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/\n// https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#withCredentials\nconst USE_XHR = window.XMLHttpRequest && 'withCredentials' in new XMLHttpRequest()\n\n// IE<10 does not support cross-origin XHR's but script tags\n// with defer won't block window.onload; ENQUEUE_REQUESTS\n// should only be true for Opera<12\nlet ENQUEUE_REQUESTS = !USE_XHR && userAgent.indexOf('MSIE') === -1 && userAgent.indexOf('Mozilla') === -1\n\nconst defaultConfig = (): PostHogConfig => ({\n api_host: 'https://app.posthog.com',\n api_method: 'POST',\n api_transport: 'XHR',\n ui_host: null,\n token: '',\n autocapture: true,\n rageclick: true,\n cross_subdomain_cookie: document?.location?.hostname?.indexOf('herokuapp.com') === -1,\n persistence: 'cookie',\n persistence_name: '',\n cookie_name: '',\n loaded: __NOOP,\n store_google: true,\n save_referrer: true,\n test: false,\n verbose: false,\n img: false,\n capture_pageview: true,\n capture_pageleave: true, // We'll only capture pageleave events if capture_pageview is also true\n debug: false,\n cookie_expiration: 365,\n upgrade: false,\n disable_session_recording: false,\n disable_persistence: false,\n disable_cookie: false,\n enable_recording_console_log: undefined, // When undefined, it falls back to the server-side setting\n secure_cookie: window?.location?.protocol === 'https:',\n ip: true,\n opt_out_capturing_by_default: false,\n opt_out_persistence_by_default: false,\n opt_out_capturing_persistence_type: 'localStorage',\n opt_out_capturing_cookie_prefix: null,\n opt_in_site_apps: false,\n property_blacklist: [],\n respect_dnt: false,\n sanitize_properties: null,\n xhr_headers: {}, // { header: value, header2: value }\n inapp_protocol: '//',\n inapp_link_new_window: false,\n request_batching: true,\n properties_string_max_length: 65535,\n session_recording: {\n // select set of rrweb config options we expose to our users\n // see https://github.com/rrweb-io/rrweb/blob/master/guide.md\n blockClass: 'ph-no-capture',\n blockSelector: null,\n ignoreClass: 'ph-ignore-input',\n maskAllInputs: true,\n maskInputOptions: {},\n maskInputFn: null,\n slimDOMOptions: {},\n collectFonts: false,\n inlineStylesheet: true,\n },\n mask_all_element_attributes: false,\n mask_all_text: false,\n advanced_disable_decide: false,\n advanced_disable_toolbar_metrics: false,\n on_xhr_error: (req) => {\n const error = 'Bad HTTP status: ' + req.status + ' ' + req.statusText\n console.error(error)\n },\n get_device_id: (uuid) => uuid,\n // Used for internal testing\n _onCapture: __NOOP,\n _capture_metrics: false,\n capture_performance: undefined,\n name: 'posthog',\n callback_fn: 'posthog._jsc',\n bootstrap: {},\n disable_compression: false,\n})\n\n/**\n * create_mplib(token:string, config:object, name:string)\n *\n * This function is used by the init method of PostHogLib objects\n * as well as the main initializer at the end of the JSLib (that\n * initializes document.posthog as well as any additional instances\n * declared before this file has loaded).\n */\nconst create_mplib = function (token: string, config?: Partial, name?: string): PostHog {\n let instance: PostHog\n const target =\n name === PRIMARY_INSTANCE_NAME || !posthog_master ? posthog_master : name ? posthog_master[name] : undefined\n\n if (target && init_type === InitType.INIT_MODULE) {\n instance = target as any\n } else {\n if (target && !_isArray(target)) {\n console.error('You have already initialized ' + name)\n // TODO: throw something instead?\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return\n }\n instance = new PostHog()\n }\n\n instance._init(token, config, name)\n instance.toolbar.maybeLoadToolbar()\n\n instance.sessionRecording = new SessionRecording(instance)\n instance.sessionRecording.startRecordingIfEnabled()\n\n instance.webPerformance = new WebPerformanceObserver(instance)\n instance.webPerformance.startObservingIfEnabled()\n\n instance.__autocapture = instance.get_config('autocapture')\n if (instance.get_config('autocapture')) {\n instance.__autocapture = instance.get_config('autocapture')\n const num_buckets = 100\n const num_enabled_buckets = 100\n if (!autocapture.enabledForProject(instance.get_config('token'), num_buckets, num_enabled_buckets)) {\n instance.__autocapture = false\n logger.log('Not in active bucket: disabling Automatic Event Collection.')\n } else if (!autocapture.isBrowserSupported()) {\n instance.__autocapture = false\n logger.log('Disabling Automatic Event Collection because this browser is not supported')\n } else {\n autocapture.init(instance)\n }\n }\n\n // if any instance on the page has debug = true, we set the\n // global debug to be true\n Config.DEBUG = Config.DEBUG || instance.get_config('debug')\n\n // if target is not defined, we called init after the lib already\n // loaded, so there won't be an array of things to execute\n if (typeof target !== 'undefined' && _isArray(target)) {\n // Crunch through the people queue first - we queue this data up &\n // flush on identify, so it's better to do all these operations first\n instance._execute_array.call(instance.people, (target as any).people)\n instance._execute_array(target)\n }\n\n return instance\n}\n\n/**\n * PostHog Library Object\n * @constructor\n */\nexport class PostHog {\n __loaded: boolean\n __loaded_recorder_version: 'v1' | 'v2' | undefined // flag that keeps track of which version of recorder is loaded\n config: PostHogConfig\n\n persistence: PostHogPersistence\n sessionManager: SessionIdManager\n pageViewIdManager: PageViewIdManager\n people: PostHogPeople\n featureFlags: PostHogFeatureFlags\n feature_flags: PostHogFeatureFlags\n toolbar: Toolbar\n sessionRecording: SessionRecording | undefined\n webPerformance: WebPerformanceObserver | undefined\n\n _captureMetrics: CaptureMetrics\n _requestQueue: RequestQueue\n _retryQueue: RetryQueue\n\n _triggered_notifs: any\n compression: Partial>\n _jsc: JSC\n __captureHooks: ((eventName: string) => void)[]\n __request_queue: [url: string, data: Record, options: XHROptions, callback?: RequestCallback][]\n __autocapture: boolean | AutocaptureConfig | undefined\n decideEndpointWasHit: boolean\n\n SentryIntegration: typeof SentryIntegration\n segmentIntegration: () => any\n\n constructor() {\n this.config = defaultConfig()\n this.compression = {}\n this.decideEndpointWasHit = false\n this.SentryIntegration = SentryIntegration\n this.segmentIntegration = () => createSegmentIntegration(this)\n this.__captureHooks = []\n this.__request_queue = []\n this.__loaded = false\n this.__loaded_recorder_version = undefined\n this.__autocapture = undefined\n this._jsc = function () {} as JSC\n this.people = new PostHogPeople(this)\n this.featureFlags = new PostHogFeatureFlags(this)\n this.feature_flags = this.featureFlags\n this.toolbar = new Toolbar(this)\n this.pageViewIdManager = new PageViewIdManager()\n\n // these are created in _init() after we have the config\n this._captureMetrics = undefined as any\n this._requestQueue = undefined as any\n this._retryQueue = undefined as any\n this.persistence = undefined as any\n this.sessionManager = undefined as any\n }\n\n // Initialization methods\n\n /**\n * This function initializes a new instance of the PostHog capturing object.\n * All new instances are added to the main posthog object as sub properties (such as\n * posthog.library_name) and also returned by this function. To define a\n * second instance on the page, you would call:\n *\n * posthog.init('new token', { your: 'config' }, 'library_name');\n *\n * and use it like so:\n *\n * posthog.library_name.capture(...);\n *\n * @param {String} token Your PostHog API token\n * @param {Object} [config] A dictionary of config options to override. See a list of default config options.\n * @param {String} [name] The name for the new posthog instance that you want created\n */\n init(token: string, config?: Partial, name?: string): PostHog | void {\n if (_isUndefined(name)) {\n console.error('You must name your new library: init(token, config, name)')\n return\n }\n if (name === PRIMARY_INSTANCE_NAME) {\n console.error('You must initialize the main posthog object right after you include the PostHog js snippet')\n return\n }\n\n const instance: PostHog = create_mplib(token, config, name)\n posthog_master[name] = instance\n instance._loaded()\n\n return instance\n }\n\n // posthog._init(token:string, config:object, name:string)\n //\n // This function sets up the current instance of the posthog\n // library. The difference between this method and the init(...)\n // method is this one initializes the actual instance, whereas the\n // init(...) method sets up a new library and calls _init on it.\n //\n _init(token: string, config: Partial = {}, name?: string): void {\n this.__loaded = true\n this.config = {} as PostHogConfig // will be set right below\n this._triggered_notifs = []\n\n this.set_config(\n _extend({}, defaultConfig(), config, {\n name: name,\n token: token,\n callback_fn: (name === PRIMARY_INSTANCE_NAME ? name : PRIMARY_INSTANCE_NAME + '.' + name) + '._jsc',\n })\n )\n\n this._jsc = function () {} as JSC\n\n // Check if recorder.js is already loaded\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n if (window?.rrweb?.record || window?.rrwebRecord) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.__loaded_recorder_version = window?.rrweb?.version\n }\n\n this._captureMetrics = new CaptureMetrics(this.get_config('_capture_metrics'))\n this._requestQueue = new RequestQueue(this._captureMetrics, this._handle_queued_event.bind(this))\n this._retryQueue = new RetryQueue(this._captureMetrics, this.get_config('on_xhr_error'))\n this.__captureHooks = []\n this.__request_queue = []\n\n this.persistence = new PostHogPersistence(this.config)\n this.sessionManager = new SessionIdManager(this.config, this.persistence)\n\n this._gdpr_init()\n\n if (config.segment) {\n // Use segments anonymousId instead\n this.config.get_device_id = () => config.segment.user().anonymousId()\n\n // If a segment user ID exists, set it as the distinct_id\n if (config.segment.user().id()) {\n this.register({\n distinct_id: config.segment.user().id(),\n })\n this.persistence.set_user_state('identified')\n }\n\n config.segment.register(this.segmentIntegration())\n }\n\n if (config.bootstrap?.distinctID !== undefined) {\n const uuid = this.get_config('get_device_id')(_UUID())\n const deviceID = config.bootstrap?.isIdentifiedID ? uuid : config.bootstrap.distinctID\n this.persistence.set_user_state(config.bootstrap?.isIdentifiedID ? 'identified' : 'anonymous')\n this.register({\n distinct_id: config.bootstrap.distinctID,\n $device_id: deviceID,\n })\n }\n\n if (this._hasBootstrappedFeatureFlags()) {\n const activeFlags = Object.keys(config.bootstrap?.featureFlags || {})\n .filter((flag) => !!config.bootstrap?.featureFlags?.[flag])\n .reduce(\n (res: Record, key) => (\n (res[key] = config.bootstrap?.featureFlags?.[key] || false), res\n ),\n {}\n )\n const featureFlagPayloads = Object.keys(config.bootstrap?.featureFlagPayloads || {})\n .filter((key) => activeFlags[key])\n .reduce((res: Record, key) => {\n if (config.bootstrap?.featureFlagPayloads?.[key]) {\n res[key] = config.bootstrap?.featureFlagPayloads?.[key]\n }\n return res\n }, {})\n\n this.featureFlags.receivedFeatureFlags({ featureFlags: activeFlags, featureFlagPayloads })\n }\n\n if (!this.get_distinct_id()) {\n // There is no need to set the distinct id\n // or the device id if something was already stored\n // in the persitence\n const uuid = this.get_config('get_device_id')(_UUID())\n this.register_once(\n {\n distinct_id: uuid,\n $device_id: uuid,\n },\n ''\n )\n // distinct id == $device_id is a proxy for anonymous user\n this.persistence.set_user_state('anonymous')\n }\n // Set up event handler for pageleave\n // Use `onpagehide` if available, see https://calendar.perfplanet.com/2020/beaconing-in-practice/#beaconing-reliability-avoiding-abandons\n window.addEventListener &&\n window.addEventListener('onpagehide' in self ? 'pagehide' : 'unload', this._handle_unload.bind(this))\n }\n\n // Private methods\n\n _loaded(): void {\n // Pause `reloadFeatureFlags` calls in config.loaded callback.\n // These feature flags are loaded in the decide call made right afterwards\n this.featureFlags.setReloadingPaused(true)\n\n try {\n this.get_config('loaded')(this)\n } catch (err) {\n console.error('`loaded` function failed', err)\n }\n\n this._start_queue_if_opted_in()\n\n // this happens after so a user can call identify in\n // the loaded callback\n if (this.get_config('capture_pageview')) {\n this.capture('$pageview', {}, { send_instantly: true })\n }\n\n // Call decide to get what features are enabled and other settings.\n // As a reminder, if the /decide endpoint is disabled, feature flags, toolbar, session recording, autocapture,\n // and compression will not be available.\n if (!this.get_config('advanced_disable_decide')) {\n new Decide(this).call()\n }\n\n this.featureFlags.resetRequestQueue()\n this.featureFlags.setReloadingPaused(false)\n }\n\n _start_queue_if_opted_in(): void {\n if (!this.has_opted_out_capturing()) {\n if (this.get_config('request_batching')) {\n this._requestQueue.poll()\n }\n }\n }\n\n _dom_loaded(): void {\n if (!this.has_opted_out_capturing()) {\n _eachArray(this.__request_queue, (item) => {\n this._send_request(...item)\n })\n }\n\n this.__request_queue = []\n\n this._start_queue_if_opted_in()\n }\n\n /**\n * _prepare_callback() should be called by callers of _send_request for use\n * as the callback argument.\n *\n * If there is no callback, this returns null.\n * If we are going to make XHR/XDR requests, this returns a function.\n * If we are going to use script tags, this returns a string to use as the\n * callback GET param.\n */\n // TODO: get rid of the \"| string\"\n _prepare_callback(callback?: RequestCallback, data?: Properties): RequestCallback | null | string {\n if (_isUndefined(callback)) {\n return null\n }\n\n if (USE_XHR) {\n return function (response) {\n callback(response, data)\n }\n } else {\n // if the user gives us a callback, we store as a random\n // property on this instances jsc function and update our\n // callback string to reflect that.\n const jsc = this._jsc\n const randomized_cb = '' + Math.floor(Math.random() * 100000000)\n const callback_string = this.get_config('callback_fn') + '[' + randomized_cb + ']'\n jsc[randomized_cb] = function (response: any) {\n delete jsc[randomized_cb]\n callback(response, data)\n }\n return callback_string\n }\n }\n\n _handle_unload(): void {\n if (!this.get_config('request_batching')) {\n if (this.get_config('capture_pageview') && this.get_config('capture_pageleave')) {\n this.capture('$pageleave', null, { transport: 'sendBeacon' })\n }\n return\n }\n\n if (this.get_config('capture_pageview') && this.get_config('capture_pageleave')) {\n this.capture('$pageleave')\n }\n if (this.get_config('_capture_metrics')) {\n this._requestQueue.updateUnloadMetrics()\n this.capture('$capture_metrics', this._captureMetrics.metrics)\n }\n this._requestQueue.unload()\n this._retryQueue.unload()\n }\n\n _handle_queued_event(url: string, data: Record, options?: XHROptions): void {\n const jsonData = JSON.stringify(data)\n this.__compress_and_send_json_request(url, jsonData, options || __NOOPTIONS, __NOOP)\n }\n\n __compress_and_send_json_request(\n url: string,\n jsonData: string,\n options: XHROptions,\n callback?: RequestCallback\n ): void {\n const [data, _options] = compressData(decideCompression(this.compression), jsonData, options)\n this._send_request(url, data, _options, callback)\n }\n\n _send_request(url: string, data: Record, options: XHROptions, callback?: RequestCallback): void {\n if (ENQUEUE_REQUESTS) {\n this.__request_queue.push([url, data, options, callback])\n return\n }\n\n const DEFAULT_OPTIONS = {\n method: this.get_config('api_method'),\n transport: this.get_config('api_transport'),\n verbose: this.get_config('verbose'),\n }\n\n options = _extend(DEFAULT_OPTIONS, options || {})\n if (!USE_XHR) {\n options.method = 'GET'\n }\n\n const useSendBeacon = 'sendBeacon' in window.navigator && options.transport === 'sendBeacon'\n url = addParamsToURL(url, options.urlQueryArgs || {}, {\n ip: this.get_config('ip'),\n })\n\n if (_isObject(data) && this.get_config('img')) {\n const img = document.createElement('img')\n img.src = url\n document.body.appendChild(img)\n } else if (useSendBeacon) {\n // beacon documentation https://w3c.github.io/beacon/\n // beacons format the message and use the type property\n // also no need to try catch as sendBeacon does not report errors\n // and is defined as best effort attempt\n try {\n window.navigator.sendBeacon(url, encodePostData(data, { ...options, sendBeacon: true }))\n } catch (e) {\n if (this.get_config('debug')) {\n console.error(e)\n }\n }\n } else if (USE_XHR) {\n try {\n xhr({\n url: url,\n data: data,\n headers: this.get_config('xhr_headers'),\n options: options,\n captureMetrics: this._captureMetrics,\n callback,\n retriesPerformedSoFar: 0,\n retryQueue: this._retryQueue,\n onXHRError: this.get_config('on_xhr_error'),\n })\n } catch (e) {\n console.error(e)\n }\n } else {\n const script = document.createElement('script')\n script.type = 'text/javascript'\n script.async = true\n script.defer = true\n script.src = url\n const s = document.getElementsByTagName('script')[0]\n s.parentNode?.insertBefore(script, s)\n }\n }\n\n /**\n * _execute_array() deals with processing any posthog function\n * calls that were called before the PostHog library were loaded\n * (and are thus stored in an array so they can be called later)\n *\n * Note: we fire off all the posthog function calls && user defined\n * functions BEFORE we fire off posthog capturing calls. This is so\n * identify/register/set_config calls can properly modify early\n * capturing calls.\n *\n * @param {Array} array\n */\n _execute_array(array: SnippetArrayItem[]): void {\n let fn_name\n const alias_calls: SnippetArrayItem[] = []\n const other_calls: SnippetArrayItem[] = []\n const capturing_calls: SnippetArrayItem[] = []\n _eachArray(array, (item) => {\n if (item) {\n fn_name = item[0]\n if (_isArray(fn_name)) {\n capturing_calls.push(item) // chained call e.g. posthog.get_group().set()\n } else if (typeof item === 'function') {\n ;(item as any).call(this)\n } else if (_isArray(item) && fn_name === 'alias') {\n alias_calls.push(item)\n } else if (\n _isArray(item) &&\n fn_name.indexOf('capture') !== -1 &&\n typeof (this as any)[fn_name] === 'function'\n ) {\n capturing_calls.push(item)\n } else {\n other_calls.push(item)\n }\n }\n })\n\n const execute = function (calls: SnippetArrayItem[], thisArg: any) {\n _eachArray(\n calls,\n function (item) {\n if (_isArray(item[0])) {\n // chained call\n let caller = thisArg\n _each(item, function (call) {\n caller = caller[call[0]].apply(caller, call.slice(1))\n })\n } else {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this[item[0]].apply(this, item.slice(1))\n }\n },\n thisArg\n )\n }\n\n execute(alias_calls, this)\n execute(other_calls, this)\n execute(capturing_calls, this)\n }\n\n _hasBootstrappedFeatureFlags(): boolean {\n return (\n (this.config.bootstrap?.featureFlags && Object.keys(this.config.bootstrap?.featureFlags).length > 0) ||\n false\n )\n }\n\n /**\n * push() keeps the standard async-array-push\n * behavior around after the lib is loaded.\n * This is only useful for external integrations that\n * do not wish to rely on our convenience methods\n * (created in the snippet).\n *\n * ### Usage:\n * posthog.push(['register', { a: 'b' }]);\n *\n * @param {Array} item A [function_name, args...] array to be executed\n */\n push(item: SnippetArrayItem): void {\n this._execute_array([item])\n }\n\n /**\n * Capture an event. This is the most important and\n * frequently used PostHog function.\n *\n * ### Usage:\n *\n * // capture an event named 'Registered'\n * posthog.capture('Registered', {'Gender': 'Male', 'Age': 21});\n *\n * // capture an event using navigator.sendBeacon\n * posthog.capture('Left page', {'duration_seconds': 35}, {transport: 'sendBeacon'});\n *\n * @param {String} event_name The name of the event. This can be anything the user does - 'Button Click', 'Sign Up', 'Item Purchased', etc.\n * @param {Object} [properties] A set of properties to include with the event you're sending. These describe the user who did the event or details about the event itself.\n * @param {Object} [options] Optional configuration for this capture request.\n * @param {String} [options.transport] Transport method for network request ('XHR' or 'sendBeacon').\n * @param {Date} [options.timestamp] Timestamp is a Date object. If not set, it'll automatically be set to the current time.\n */\n capture(\n event_name: string,\n properties?: Properties | null,\n options: CaptureOptions = __NOOPTIONS\n ): CaptureResult | void {\n // While developing, a developer might purposefully _not_ call init(),\n // in this case, we would like capture to be a noop.\n if (!this.__loaded) {\n return\n }\n\n if (userOptedOut(this, false)) {\n return\n }\n\n this._captureMetrics.incr('capture')\n if (event_name === '$snapshot') {\n this._captureMetrics.incr('snapshot')\n }\n\n options = options || __NOOPTIONS\n const transport = options['transport'] // external API, don't minify 'transport' prop\n if (transport) {\n options.transport = transport // 'transport' prop name can be minified internally\n }\n\n // typing doesn't prevent interesting data\n if (_isUndefined(event_name) || typeof event_name !== 'string') {\n console.error('No event name provided to posthog.capture')\n return\n }\n\n if (_isBlockedUA(userAgent)) {\n return\n }\n\n // update persistence\n this.persistence.update_search_keyword(document.referrer)\n\n if (this.get_config('store_google')) {\n this.persistence.update_campaign_params()\n }\n if (this.get_config('save_referrer')) {\n this.persistence.update_referrer_info(document.referrer)\n }\n\n let data: CaptureResult = {\n event: event_name,\n properties: this._calculate_event_properties(event_name, properties || {}),\n }\n\n if (event_name === '$identify' && options.$set) {\n data['$set'] = options['$set']\n }\n\n data = _copyAndTruncateStrings(\n data,\n options._noTruncate ? null : this.get_config('properties_string_max_length')\n )\n data.timestamp = options.timestamp || new Date()\n\n if (this.get_config('debug')) {\n logger.log('PostHog.js send', data)\n }\n const jsonData = JSON.stringify(data)\n\n const url = this.get_config('api_host') + (options.endpoint || '/e/')\n\n const has_unique_traits = options !== __NOOPTIONS\n\n if (\n this.get_config('request_batching') &&\n (!has_unique_traits || options._batchKey) &&\n !options.send_instantly\n ) {\n this._requestQueue.enqueue(url, data, options)\n } else {\n this.__compress_and_send_json_request(url, jsonData, options)\n }\n\n this._invokeCaptureHooks(event_name, data)\n\n return data\n }\n\n _addCaptureHook(callback: (eventName: string) => void): void {\n this.__captureHooks.push(callback)\n }\n\n _invokeCaptureHooks(eventName: string, eventData: CaptureResult): void {\n this.config._onCapture(eventName, eventData)\n _each(this.__captureHooks, (callback) => callback(eventName))\n }\n\n _calculate_event_properties(event_name: string, event_properties: Properties): Properties {\n // set defaults\n const start_timestamp = this.persistence.remove_event_timer(event_name)\n let properties = { ...event_properties }\n properties['token'] = this.get_config('token')\n\n if (event_name === '$snapshot') {\n const persistenceProps = this.persistence.properties()\n properties['distinct_id'] = persistenceProps.distinct_id\n return properties\n }\n\n const infoProperties = _info.properties()\n\n if (this.sessionManager) {\n const { sessionId, windowId } = this.sessionManager.checkAndGetSessionAndWindowId()\n properties['$session_id'] = sessionId\n properties['$window_id'] = windowId\n }\n\n if (this.webPerformance?.isEnabled) {\n if (event_name === '$pageview') {\n this.pageViewIdManager.onPageview()\n }\n properties = _extend(properties, { $pageview_id: this.pageViewIdManager.getPageViewId() })\n }\n\n if (event_name === '$performance_event') {\n const persistenceProps = this.persistence.properties()\n // Early exit for $performance_event as we only need session and $current_url\n properties['distinct_id'] = persistenceProps.distinct_id\n properties['$current_url'] = infoProperties.$current_url\n return properties\n }\n\n // set $duration if time_event was previously called for this event\n if (typeof start_timestamp !== 'undefined') {\n const duration_in_ms = new Date().getTime() - start_timestamp\n properties['$duration'] = parseFloat((duration_in_ms / 1000).toFixed(3))\n }\n\n // note: extend writes to the first object, so lets make sure we\n // don't write to the persistence properties object and info\n // properties object by passing in a new object\n\n // update properties with pageview info and super-properties\n properties = _extend({}, infoProperties, this.persistence.properties(), properties)\n\n const property_blacklist = this.get_config('property_blacklist')\n if (_isArray(property_blacklist)) {\n _each(property_blacklist, function (blacklisted_prop) {\n delete properties[blacklisted_prop]\n })\n } else {\n console.error('Invalid value for property_blacklist config: ' + property_blacklist)\n }\n\n const sanitize_properties = this.get_config('sanitize_properties')\n if (sanitize_properties) {\n properties = sanitize_properties(properties, event_name)\n }\n\n return properties\n }\n\n /**\n * Register a set of super properties, which are included with all\n * events. This will overwrite previous super property values.\n *\n * ### Usage:\n *\n * // register 'Gender' as a super property\n * posthog.register({'Gender': 'Female'});\n *\n * // register several super properties when a user signs up\n * posthog.register({\n * 'Email': 'jdoe@example.com',\n * 'Account Type': 'Free'\n * });\n *\n * @param {Object} properties An associative array of properties to store about the user\n * @param {Number} [days] How many days since the user's last visit to store the super properties\n */\n register(properties: Properties, days?: number): void {\n this.persistence.register(properties, days)\n }\n\n /**\n * Register a set of super properties only once. This will not\n * overwrite previous super property values, unlike register().\n *\n * ### Usage:\n *\n * // register a super property for the first time only\n * posthog.register_once({\n * 'First Login Date': new Date().toISOString()\n * });\n *\n * ### Notes:\n *\n * If default_value is specified, current super properties\n * with that value will be overwritten.\n *\n * @param {Object} properties An associative array of properties to store about the user\n * @param {*} [default_value] Value to override if already set in super properties (ex: 'False') Default: 'None'\n * @param {Number} [days] How many days since the users last visit to store the super properties\n */\n register_once(properties: Properties, default_value?: Property, days?: number): void {\n this.persistence.register_once(properties, default_value, days)\n }\n\n /**\n * Delete a super property stored with the current user.\n *\n * @param {String} property The name of the super property to remove\n */\n unregister(property: string): void {\n this.persistence.unregister(property)\n }\n\n _register_single(prop: string, value: Property) {\n this.register({ [prop]: value })\n }\n\n /*\n * Get feature flag value for user (supports multivariate flags).\n *\n * ### Usage:\n *\n * if(posthog.getFeatureFlag('beta-feature') === 'some-value') { // do something }\n *\n * @param {Object|String} prop Key of the feature flag.\n * @param {Object|String} options (optional) If {send_event: false}, we won't send an $feature_flag_call event to PostHog.\n */\n getFeatureFlag(key: string, options?: { send_event?: boolean }): boolean | string | undefined {\n return this.featureFlags.getFeatureFlag(key, options)\n }\n\n /*\n * Get feature flag payload value matching key for user (supports multivariate flags).\n *\n * ### Usage:\n *\n * if(posthog.getFeatureFlag('beta-feature') === 'some-value') {\n * const someValue = posthog.getFeatureFlagPayload('beta-feature')\n * // do something\n * }\n *\n * @param {Object|String} prop Key of the feature flag.\n */\n getFeatureFlagPayload(key: string): JsonType {\n const payload = this.featureFlags.getFeatureFlagPayload(key)\n try {\n return JSON.parse(payload as any)\n } catch {\n return payload\n }\n }\n\n /*\n * See if feature flag is enabled for user.\n *\n * ### Usage:\n *\n * if(posthog.isFeatureEnabled('beta-feature')) { // do something }\n *\n * @param {Object|String} prop Key of the feature flag.\n * @param {Object|String} options (optional) If {send_event: false}, we won't send an $feature_flag_call event to PostHog.\n */\n isFeatureEnabled(key: string, options?: isFeatureEnabledOptions): boolean {\n return this.featureFlags.isFeatureEnabled(key, options)\n }\n\n reloadFeatureFlags(): void {\n this.featureFlags.reloadFeatureFlags()\n }\n\n /*\n * Register an event listener that runs when feature flags become available or when they change.\n * If there are flags, the listener is called immediately in addition to being called on future changes.\n *\n * ### Usage:\n *\n * posthog.onFeatureFlags(function(featureFlags) { // do something })\n *\n * @param {Function} [callback] The callback function will be called once the feature flags are ready or when they are updated.\n * It'll return a list of feature flags enabled for the user.\n * @returns {Function} A function that can be called to unsubscribe the listener. Used by useEffect when the component unmounts.\n */\n onFeatureFlags(callback: (flags: string[], variants: Record) => void): () => void {\n return this.featureFlags.onFeatureFlags(callback)\n }\n\n /**\n * Identify a user with a unique ID instead of a PostHog\n * randomly generated distinct_id. If the method is never called,\n * then unique visitors will be identified by a UUID that is generated\n * the first time they visit the site.\n *\n * If user properties are passed, they are also sent to posthog.\n *\n * ### Usage:\n *\n * posthog.identify('[user unique id]')\n * posthog.identify('[user unique id]', { email: 'john@example.com' })\n * posthog.identify('[user unique id]', {}, { referral_code: '12345' })\n *\n * ### Notes:\n *\n * You can call this function to overwrite a previously set\n * unique ID for the current user.\n *\n * If the user has been identified ($user_state in persistence is set to 'identified'),\n * then capture of $identify is skipped to avoid merging users. For example,\n * if your system allows an admin user to impersonate another user.\n *\n * Then a single browser instance can have:\n *\n * `identify('a') -> capture(1) -> identify('b') -> capture(2)`\n *\n * and capture 1 and capture 2 will have the correct distinct_id.\n * but users a and b will NOT be merged in posthog.\n *\n * However, if reset is called then:\n *\n * `identify('a') -> capture(1) -> reset() -> capture(2) -> identify('b') -> capture(3)`\n *\n * users a and b are not merged.\n * Capture 1 is associated with user a.\n * A new distinct id is generated for capture 2.\n * which is merged with user b.\n * So, capture 2 and 3 are associated with user b.\n *\n * If you want to merge two identified users, you can call posthog.alias\n *\n * @param {String} [new_distinct_id] A string that uniquely identifies a user. If not provided, the distinct_id currently in the persistent store (cookie or localStorage) will be used.\n * @param {Object} [userPropertiesToSet] Optional: An associative array of properties to store about the user\n * @param {Object} [userPropertiesToSetOnce] Optional: An associative array of properties to store about the user. If property is previously set, this does not override that value.\n */\n identify(new_distinct_id?: string, userPropertiesToSet?: Properties, userPropertiesToSetOnce?: Properties): void {\n //if the new_distinct_id has not been set ignore the identify event\n if (!new_distinct_id) {\n console.error('Unique user id has not been set in posthog.identify')\n return\n }\n\n this._captureMetrics.incr('identify')\n\n const previous_distinct_id = this.get_distinct_id()\n this.register({ $user_id: new_distinct_id })\n\n if (!this.get_property('$device_id')) {\n // The persisted distinct id might not actually be a device id at all\n // it might be a distinct id of the user from before\n const device_id = previous_distinct_id\n this.register_once(\n {\n $had_persisted_distinct_id: true,\n $device_id: device_id,\n },\n ''\n )\n }\n\n // if the previous distinct id had an alias stored, then we clear it\n if (new_distinct_id !== previous_distinct_id && new_distinct_id !== this.get_property(ALIAS_ID_KEY)) {\n this.unregister(ALIAS_ID_KEY)\n this.register({ distinct_id: new_distinct_id })\n }\n\n const isKnownAnonymous = this.persistence.get_user_state() === 'anonymous'\n\n // send an $identify event any time the distinct_id is changing and the old ID is an anoymous ID\n // - logic on the server will determine whether or not to do anything with it.\n if (new_distinct_id !== previous_distinct_id && isKnownAnonymous) {\n this.persistence.set_user_state('identified')\n this.capture(\n '$identify',\n {\n distinct_id: new_distinct_id,\n $anon_distinct_id: previous_distinct_id,\n },\n { $set: userPropertiesToSet || {}, $set_once: userPropertiesToSetOnce || {} }\n )\n // let the reload feature flag request know to send this previous distinct id\n // for flag consistency\n this.featureFlags.setAnonymousDistinctId(previous_distinct_id)\n } else {\n if (userPropertiesToSet) {\n this.people.set(userPropertiesToSet)\n }\n if (userPropertiesToSetOnce) {\n this.people.set_once(userPropertiesToSetOnce)\n }\n }\n\n // Reload active feature flags if the user identity changes.\n // Note we don't reload this on property changes as these get processed async\n if (new_distinct_id !== previous_distinct_id) {\n this.reloadFeatureFlags()\n }\n }\n\n /**\n * Alpha feature: don't use unless you know what you're doing!\n *\n * Sets group analytics information for subsequent events and reloads feature flags.\n *\n * @param {String} groupType Group type (example: 'organization')\n * @param {String} groupKey Group key (example: 'org::5')\n * @param {Object} groupPropertiesToSet Optional properties to set for group\n */\n group(groupType: string, groupKey: string, groupPropertiesToSet?: Properties): void {\n if (!groupType || !groupKey) {\n console.error('posthog.group requires a group type and group key')\n return\n }\n\n this._captureMetrics.incr('group')\n\n const existingGroups = this.getGroups()\n\n this.register({ $groups: { ...existingGroups, [groupType]: groupKey } })\n\n if (groupPropertiesToSet) {\n this.capture('$groupidentify', {\n $group_type: groupType,\n $group_key: groupKey,\n $group_set: groupPropertiesToSet,\n })\n }\n\n // If groups change, reload feature flags.\n if (existingGroups[groupType] !== groupKey) {\n this.reloadFeatureFlags()\n }\n }\n\n /**\n * Resets only the group properties of the user currently logged in.\n */\n resetGroups(): void {\n this.register({ $groups: {} })\n\n // If groups changed, reload feature flags.\n this.reloadFeatureFlags()\n }\n\n /**\n * Clears super properties and generates a new random distinct_id for this instance.\n * Useful for clearing data when a user logs out.\n */\n reset(reset_device_id?: boolean): void {\n const device_id = this.get_property('$device_id')\n this.persistence.clear()\n this.persistence.set_user_state('anonymous')\n this.sessionManager.resetSessionId()\n const uuid = this.get_config('get_device_id')(_UUID())\n this.register_once(\n {\n distinct_id: uuid,\n $device_id: reset_device_id ? uuid : device_id,\n },\n ''\n )\n }\n\n /**\n * Returns the current distinct id of the user. This is either the id automatically\n * generated by the library or the id that has been passed by a call to identify().\n *\n * ### Notes:\n *\n * get_distinct_id() can only be called after the PostHog library has finished loading.\n * init() has a loaded function available to handle this automatically. For example:\n *\n * // set distinct_id after the posthog library has loaded\n * posthog.init('YOUR PROJECT TOKEN', {\n * loaded: function(posthog) {\n * distinct_id = posthog.get_distinct_id();\n * }\n * });\n */\n get_distinct_id(): string {\n return this.get_property('distinct_id')\n }\n\n getGroups(): Record {\n return this.get_property('$groups') || {}\n }\n\n /**\n * Create an alias, which PostHog will use to link two distinct_ids going forward (not retroactively).\n * Multiple aliases can map to the same original ID, but not vice-versa. Aliases can also be chained - the\n * following is a valid scenario:\n *\n * posthog.alias('new_id', 'existing_id');\n * ...\n * posthog.alias('newer_id', 'new_id');\n *\n * If the original ID is not passed in, we will use the current distinct_id - probably the auto-generated GUID.\n *\n * ### Notes:\n *\n * The best practice is to call alias() when a unique ID is first created for a user\n * (e.g., when a user first registers for an account and provides an email address).\n * alias() should never be called more than once for a given user, except to\n * chain a newer ID to a previously new ID, as described above.\n *\n * @param {String} alias A unique identifier that you want to use for this user in the future.\n * @param {String} [original] The current identifier being used for this user.\n */\n alias(alias: string, original?: string): CaptureResult | void | number {\n // If the $people_distinct_id key exists in persistence, there has been a previous\n // posthog.people.identify() call made for this user. It is VERY BAD to make an alias with\n // this ID, as it will duplicate users.\n if (alias === this.get_property(PEOPLE_DISTINCT_ID_KEY)) {\n logger.critical('Attempting to create alias for existing People user - aborting.')\n return -2\n }\n\n if (_isUndefined(original)) {\n original = this.get_distinct_id()\n }\n if (alias !== original) {\n this._register_single(ALIAS_ID_KEY, alias)\n return this.capture('$create_alias', { alias: alias, distinct_id: original })\n } else {\n console.error('alias matches current distinct_id - skipping api call.')\n this.identify(alias)\n return -1\n }\n }\n\n /**\n * Update the configuration of a posthog library instance.\n *\n * The default config is:\n *\n * {\n * // PostHog API host\n * api_host: 'https://app.posthog.com',\n *\n * // HTTP method for capturing requests\n * api_method: 'POST'\n *\n * // PostHog web app host, currently only used by the Sentry integration.\n * // This will only be different from api_host when using a reverse-proxied API host – in that case\n * // the original web app host needs to be passed here so that links to the web app are still convenient.\n * ui_host: 'https://app.posthog.com',\n *\n * // Automatically capture clicks, form submissions and change events\n * autocapture: true\n *\n * // Capture rage clicks\n * rageclick: true\n *\n * // transport for sending requests ('XHR' or 'sendBeacon')\n * // NB: sendBeacon should only be used for scenarios such as\n * // page unload where a \"best-effort\" attempt to send is\n * // acceptable; the sendBeacon API does not support callbacks\n * // or any way to know the result of the request. PostHog\n * // capturing via sendBeacon will not support any event-\n * // batching or retry mechanisms.\n * api_transport: 'XHR'\n *\n * // super properties cookie expiration (in days)\n * cookie_expiration: 365\n *\n * // super properties span subdomains\n * cross_subdomain_cookie: true\n *\n * // debug mode\n * debug: false\n *\n * // if this is true, the posthog cookie or localStorage entry\n * // will be deleted, and no user persistence will take place\n * disable_persistence: false\n *\n * // if this is true, PostHog will automatically determine\n * // City, Region and Country data using the IP address of\n * //the client\n * ip: true\n *\n * // opt users out of capturing by this PostHog instance by default\n * opt_out_capturing_by_default: false\n *\n * // opt users out of browser data storage by this PostHog instance by default\n * opt_out_persistence_by_default: false\n *\n * // persistence mechanism used by opt-in/opt-out methods - cookie\n * // or localStorage - falls back to cookie if localStorage is unavailable\n * opt_out_capturing_persistence_type: 'localStorage'\n *\n * // customize the name of cookie/localStorage set by opt-in/opt-out methods\n * opt_out_capturing_cookie_prefix: null\n *\n * // type of persistent store for super properties (cookie/\n * // localStorage) if set to 'localStorage', any existing\n * // posthog cookie value with the same persistence_name\n * // will be transferred to localStorage and deleted\n * persistence: 'cookie'\n *\n * // name for super properties persistent store\n * persistence_name: ''\n *\n * // names of properties/superproperties which should never\n * // be sent with capture() calls\n * property_blacklist: []\n *\n * // if this is true, posthog cookies will be marked as\n * // secure, meaning they will only be transmitted over https\n * secure_cookie: false\n *\n * // should we capture a page view on page load\n * capture_pageview: true\n *\n * // if you set upgrade to be true, the library will check for\n * // a cookie from our old js library and import super\n * // properties from it, then the old cookie is deleted\n * // The upgrade config option only works in the initialization,\n * // so make sure you set it when you create the library.\n * upgrade: false\n *\n * // if this is true, session recording is always disabled.\n * disable_session_recording: false,\n *\n * // extra HTTP request headers to set for each API request, in\n * // the format {'Header-Name': value}\n * xhr_headers: {}\n *\n * // protocol for fetching in-app message resources, e.g.\n * // 'https://' or 'http://'; defaults to '//' (which defers to the\n * // current page's protocol)\n * inapp_protocol: '//'\n *\n * // whether to open in-app message link in new tab/window\n * inapp_link_new_window: false\n *\n * // a set of rrweb config options that PostHog users can configure\n * // see https://github.com/rrweb-io/rrweb/blob/master/guide.md\n * session_recording: {\n * blockClass: 'ph-no-capture',\n * blockSelector: null,\n * ignoreClass: 'ph-ignore-input',\n * maskAllInputs: true,\n * maskInputOptions: {},\n * maskInputFn: null,\n * slimDOMOptions: {},\n * collectFonts: false\n * }\n *\n * // prevent autocapture from capturing any attribute names on elements\n * mask_all_element_attributes: false\n *\n * // prevent autocapture from capturing textContent on all elements\n * mask_all_text: false\n *\n * // Anonymous users get a random UUID as their device by default.\n * // This option allows overriding that option.\n * get_device_id: (uuid) => uuid\n * }\n *\n *\n * @param {Object} config A dictionary of new configuration values to update\n */\n\n set_config(config: Partial): void {\n const oldConfig = { ...this.config }\n if (_isObject(config)) {\n _extend(this.config, config)\n\n if (!this.get_config('persistence_name')) {\n this.config.persistence_name = this.config.cookie_name\n }\n if (!this.get_config('disable_persistence')) {\n this.config.disable_persistence = this.config.disable_cookie\n }\n\n if (this.persistence) {\n this.persistence.update_config(this.config)\n }\n\n if (localStore.is_supported() && localStore.get('ph_debug') === 'true') {\n this.config.debug = true\n }\n if (this.get_config('debug')) {\n Config.DEBUG = true\n }\n\n if (this.sessionRecording && typeof config.disable_session_recording !== 'undefined') {\n if (oldConfig.disable_session_recording !== config.disable_session_recording) {\n if (config.disable_session_recording) {\n this.sessionRecording.stopRecording()\n } else {\n this.sessionRecording.startRecordingIfEnabled()\n }\n }\n }\n }\n }\n\n /**\n * turns session recording on, and updates the config option\n * disable_session_recording to false\n */\n startSessionRecording(): void {\n this.set_config({ disable_session_recording: false })\n }\n\n /**\n * turns session recording off, and updates the config option\n * disable_session_recording to true\n */\n stopSessionRecording(): void {\n this.set_config({ disable_session_recording: true })\n }\n\n /**\n * returns a boolean indicating whether session recording\n * is currently running\n */\n sessionRecordingStarted(): boolean {\n return !!this.sessionRecording?.started()\n }\n\n /**\n * returns a boolean indicating whether the toolbar loaded\n * @param toolbarParams\n */\n\n loadToolbar(params: ToolbarParams): boolean {\n return this.toolbar.loadToolbar(params)\n }\n\n /**\n * returns the current config object for the library.\n */\n get_config(prop_name: K): PostHogConfig[K] {\n return this.config?.[prop_name]\n }\n\n /**\n * Returns the value of the super property named property_name. If no such\n * property is set, get_property() will return the undefined value.\n *\n * ### Notes:\n *\n * get_property() can only be called after the PostHog library has finished loading.\n * init() has a loaded function available to handle this automatically. For example:\n *\n * // grab value for 'user_id' after the posthog library has loaded\n * posthog.init('YOUR PROJECT TOKEN', {\n * loaded: function(posthog) {\n * user_id = posthog.get_property('user_id');\n * }\n * });\n *\n * @param {String} property_name The name of the super property you want to retrieve\n */\n get_property(property_name: string): Property | undefined {\n return this.persistence['props'][property_name]\n }\n\n toString(): string {\n let name = this.get_config('name') ?? PRIMARY_INSTANCE_NAME\n if (name !== PRIMARY_INSTANCE_NAME) {\n name = PRIMARY_INSTANCE_NAME + '.' + name\n }\n return name\n }\n\n // perform some housekeeping around GDPR opt-in/out state\n _gdpr_init(): void {\n const is_localStorage_requested = this.get_config('opt_out_capturing_persistence_type') === 'localStorage'\n\n // try to convert opt-in/out cookies to localStorage if possible\n if (is_localStorage_requested && localStore.is_supported()) {\n if (!this.has_opted_in_capturing() && this.has_opted_in_capturing({ persistence_type: 'cookie' })) {\n this.opt_in_capturing({ enable_persistence: false })\n }\n if (!this.has_opted_out_capturing() && this.has_opted_out_capturing({ persistence_type: 'cookie' })) {\n this.opt_out_capturing({ clear_persistence: false })\n }\n this.clear_opt_in_out_capturing({\n persistence_type: 'cookie',\n enable_persistence: false,\n })\n }\n\n // check whether the user has already opted out - if so, clear & disable persistence\n if (this.has_opted_out_capturing()) {\n this._gdpr_update_persistence({ clear_persistence: true })\n\n // check whether we should opt out by default\n // note: we don't clear persistence here by default since opt-out default state is often\n // used as an initial state while GDPR information is being collected\n } else if (\n !this.has_opted_in_capturing() &&\n (this.get_config('opt_out_capturing_by_default') || cookieStore.get('ph_optout'))\n ) {\n cookieStore.remove('ph_optout')\n this.opt_out_capturing({\n clear_persistence: this.get_config('opt_out_persistence_by_default'),\n })\n }\n }\n\n /**\n * Enable or disable persistence based on options\n * only enable/disable if persistence is not already in this state\n * @param {boolean} [options.clear_persistence] If true, will delete all data stored by the sdk in persistence and disable it\n * @param {boolean} [options.enable_persistence] If true, will re-enable sdk persistence\n */\n _gdpr_update_persistence(options: Partial): void {\n let disabled\n if (options && options['clear_persistence']) {\n disabled = true\n } else if (options && options['enable_persistence']) {\n disabled = false\n } else {\n return\n }\n\n if (!this.get_config('disable_persistence') && this.persistence.disabled !== disabled) {\n this.persistence.set_disabled(disabled)\n }\n }\n\n // call a base gdpr function after constructing the appropriate token and options args\n _gdpr_call_func(\n func: (token: string, options: GDPROptions) => R,\n options?: Partial\n ): R {\n options = _extend(\n {\n capture: this.capture.bind(this),\n persistence_type: this.get_config('opt_out_capturing_persistence_type'),\n cookie_prefix: this.get_config('opt_out_capturing_cookie_prefix'),\n cookie_expiration: this.get_config('cookie_expiration'),\n cross_subdomain_cookie: this.get_config('cross_subdomain_cookie'),\n secure_cookie: this.get_config('secure_cookie'),\n },\n options || {}\n )\n\n // check if localStorage can be used for recording opt out status, fall back to cookie if not\n if (!localStore.is_supported() && options['persistence_type'] === 'localStorage') {\n options['persistence_type'] = 'cookie'\n }\n\n return func(this.get_config('token'), {\n capture: options['capture'],\n captureEventName: options['capture_event_name'],\n captureProperties: options['capture_properties'],\n persistenceType: options['persistence_type'],\n persistencePrefix: options['cookie_prefix'],\n cookieExpiration: options['cookie_expiration'],\n crossSubdomainCookie: options['cross_subdomain_cookie'],\n secureCookie: options['secure_cookie'],\n })\n }\n\n /**\n * Opt the user in to data capturing and cookies/localstorage for this PostHog instance\n *\n * ### Usage\n *\n * // opt user in\n * posthog.opt_in_capturing();\n *\n * // opt user in with specific event name, properties, cookie configuration\n * posthog.opt_in_capturing({\n * capture_event_name: 'User opted in',\n * capture_event_properties: {\n * 'Email': 'jdoe@example.com'\n * },\n * cookie_expiration: 30,\n * secure_cookie: true\n * });\n *\n * @param {Object} [options] A dictionary of config options to override\n * @param {function} [options.capture] Function used for capturing a PostHog event to record the opt-in action (default is this PostHog instance's capture method)\n * @param {string} [options.capture_event_name=$opt_in] Event name to be used for capturing the opt-in action\n * @param {Object} [options.capture_properties] Set of properties to be captured along with the opt-in action\n * @param {boolean} [options.enable_persistence=true] If true, will re-enable sdk persistence\n * @param {string} [options.persistence_type=localStorage] Persistence mechanism used - cookie or localStorage - falls back to cookie if localStorage is unavailable\n * @param {string} [options.cookie_prefix=__ph_opt_in_out] Custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookie_expiration] Number of days until the opt-in cookie expires (overrides value specified in this PostHog instance's config)\n * @param {boolean} [options.cross_subdomain_cookie] Whether the opt-in cookie is set as cross-subdomain or not (overrides value specified in this PostHog instance's config)\n * @param {boolean} [options.secure_cookie] Whether the opt-in cookie is set as secure or not (overrides value specified in this PostHog instance's config)\n */\n opt_in_capturing(options?: Partial): void {\n options = _extend(\n {\n enable_persistence: true,\n },\n options || {}\n )\n\n this._gdpr_call_func(optIn, options)\n this._gdpr_update_persistence(options)\n }\n\n /**\n * Opt the user out of data capturing and cookies/localstorage for this PostHog instance\n *\n * ### Usage\n *\n * // opt user out\n * posthog.opt_out_capturing();\n *\n * // opt user out with different cookie configuration from PostHog instance\n * posthog.opt_out_capturing({\n * cookie_expiration: 30,\n * secure_cookie: true\n * });\n *\n * @param {Object} [options] A dictionary of config options to override\n * @param {boolean} [options.clear_persistence=true] If true, will delete all data stored by the sdk in persistence\n * @param {string} [options.persistence_type=localStorage] Persistence mechanism used - cookie or localStorage - falls back to cookie if localStorage is unavailable\n * @param {string} [options.cookie_prefix=__ph_opt_in_out] Custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookie_expiration] Number of days until the opt-in cookie expires (overrides value specified in this PostHog instance's config)\n * @param {boolean} [options.cross_subdomain_cookie] Whether the opt-in cookie is set as cross-subdomain or not (overrides value specified in this PostHog instance's config)\n * @param {boolean} [options.secure_cookie] Whether the opt-in cookie is set as secure or not (overrides value specified in this PostHog instance's config)\n */\n opt_out_capturing(options?: Partial): void {\n const _options = _extend(\n {\n clear_persistence: true,\n },\n options || {}\n )\n\n this._gdpr_call_func(optOut, _options)\n this._gdpr_update_persistence(_options)\n }\n\n /**\n * Check whether the user has opted in to data capturing and cookies/localstorage for this PostHog instance\n *\n * ### Usage\n *\n * const has_opted_in = posthog.has_opted_in_capturing();\n * // use has_opted_in value\n *\n * @param {Object} [options] A dictionary of config options to override\n * @param {string} [options.persistence_type=localStorage] Persistence mechanism used - cookie or localStorage - falls back to cookie if localStorage is unavailable\n * @param {string} [options.cookie_prefix=__ph_opt_in_out] Custom prefix to be used in the cookie/localstorage name\n * @returns {boolean} current opt-in status\n */\n has_opted_in_capturing(options?: Partial): boolean {\n return this._gdpr_call_func(hasOptedIn, options)\n }\n\n /**\n * Check whether the user has opted out of data capturing and cookies/localstorage for this PostHog instance\n *\n * ### Usage\n *\n * const has_opted_out = posthog.has_opted_out_capturing();\n * // use has_opted_out value\n *\n * @param {Object} [options] A dictionary of config options to override\n * @param {string} [options.persistence_type=localStorage] Persistence mechanism used - cookie or localStorage - falls back to cookie if localStorage is unavailable\n * @param {string} [options.cookie_prefix=__ph_opt_in_out] Custom prefix to be used in the cookie/localstorage name\n * @returns {boolean} current opt-out status\n */\n has_opted_out_capturing(options?: Partial): boolean {\n return this._gdpr_call_func(hasOptedOut, options)\n }\n\n /**\n * Clear the user's opt in/out status of data capturing and cookies/localstorage for this PostHog instance\n *\n * ### Usage\n *\n * // clear user's opt-in/out status\n * posthog.clear_opt_in_out_capturing();\n *\n * // clear user's opt-in/out status with specific cookie configuration - should match\n * // configuration used when opt_in_capturing/opt_out_capturing methods were called.\n * posthog.clear_opt_in_out_capturing({\n * cookie_expiration: 30,\n * secure_cookie: true\n * });\n *\n * @param {Object} [options] A dictionary of config options to override\n * @param {boolean} [options.enable_persistence=true] If true, will re-enable sdk persistence\n * @param {string} [options.persistence_type=localStorage] Persistence mechanism used - cookie or localStorage - falls back to cookie if localStorage is unavailable\n * @param {string} [options.cookie_prefix=__ph_opt_in_out] Custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookie_expiration] Number of days until the opt-in cookie expires (overrides value specified in this PostHog instance's config)\n * @param {boolean} [options.cross_subdomain_cookie] Whether the opt-in cookie is set as cross-subdomain or not (overrides value specified in this PostHog instance's config)\n * @param {boolean} [options.secure_cookie] Whether the opt-in cookie is set as secure or not (overrides value specified in this PostHog instance's config)\n */\n clear_opt_in_out_capturing(options?: Partial): void {\n const _options: Partial = _extend(\n {\n enable_persistence: true,\n },\n options ?? {}\n )\n this._gdpr_call_func(clearOptInOut, _options)\n this._gdpr_update_persistence(_options)\n }\n\n debug(debug?: boolean): void {\n if (debug === false) {\n window.console.log(\"You've disabled debug mode.\")\n localStorage && localStorage.removeItem('ph_debug')\n this.set_config({ debug: false })\n } else {\n window.console.log(\n \"You're now in debug mode. All calls to PostHog will be logged in your console.\\nYou can disable this with `posthog.debug(false)`.\"\n )\n localStorage && localStorage.setItem('ph_debug', 'true')\n this.set_config({ debug: true })\n }\n }\n\n decodeLZ64(input: string | null | undefined): string | null {\n return LZString.decompressFromBase64(input || null)\n }\n}\n\n_safewrap_class(PostHog, ['identify'])\n\nconst instances: Record = {}\nconst extend_mp = function () {\n // add all the sub posthog instances\n _each(instances, function (instance, name) {\n if (name !== PRIMARY_INSTANCE_NAME) {\n posthog_master[name] = instance\n }\n })\n}\n\nconst override_ph_init_func = function () {\n // we override the snippets init function to handle the case where a\n // user initializes the posthog library after the script loads & runs\n posthog_master['init'] = function (token?: string, config?: Partial, name?: string) {\n if (name) {\n // initialize a sub library\n if (!posthog_master[name]) {\n posthog_master[name] = instances[name] = create_mplib(token || '', config || {}, name)\n posthog_master[name]._loaded()\n }\n return posthog_master[name]\n } else {\n let instance: PostHog = posthog_master as any as PostHog\n\n if (instances[PRIMARY_INSTANCE_NAME]) {\n // main posthog lib already initialized\n instance = instances[PRIMARY_INSTANCE_NAME]\n } else if (token) {\n // intialize the main posthog lib\n instance = create_mplib(token, config || {}, PRIMARY_INSTANCE_NAME)\n instance._loaded()\n instances[PRIMARY_INSTANCE_NAME] = instance\n }\n\n ;(posthog_master as any) = instance\n if (init_type === InitType.INIT_SNIPPET) {\n ;(window as any)[PRIMARY_INSTANCE_NAME] = posthog_master\n }\n extend_mp()\n return instance\n }\n }\n}\n\nconst add_dom_loaded_handler = function () {\n // Cross browser DOM Loaded support\n function dom_loaded_handler() {\n // function flag since we only want to execute this once\n if ((dom_loaded_handler as any).done) {\n return\n }\n ;(dom_loaded_handler as any).done = true\n\n ENQUEUE_REQUESTS = false\n\n _each(instances, function (inst: PostHog) {\n inst._dom_loaded()\n })\n }\n\n if (document.addEventListener) {\n if (document.readyState === 'complete') {\n // safari 4 can fire the DOMContentLoaded event before loading all\n // external JS (including this file). you will see some copypasta\n // on the internet that checks for 'complete' and 'loaded', but\n // 'loaded' is an IE thing\n dom_loaded_handler()\n } else {\n document.addEventListener('DOMContentLoaded', dom_loaded_handler, false)\n }\n }\n\n // fallback handler, always will work\n _register_event(window, 'load', dom_loaded_handler, true)\n}\n\nexport function init_from_snippet(): void {\n init_type = InitType.INIT_SNIPPET\n if (_isUndefined((window as any).posthog)) {\n ;(window as any).posthog = []\n }\n posthog_master = (window as any).posthog\n\n if (posthog_master['__loaded'] || (posthog_master['config'] && posthog_master['persistence'])) {\n // lib has already been loaded at least once; we don't want to override the global object this time so bomb early\n console.error('PostHog library has already been downloaded at least once.')\n return\n }\n\n // Load instances of the PostHog Library\n _each(posthog_master['_i'], function (item: [token: string, config: Partial, name: string]) {\n if (item && _isArray(item)) {\n instances[item[2]] = create_mplib(...item)\n }\n })\n\n override_ph_init_func()\n ;(posthog_master['init'] as any)()\n\n // Fire loaded events after updating the window's posthog object\n _each(instances, function (instance) {\n instance._loaded()\n })\n\n add_dom_loaded_handler()\n}\n\nexport function init_as_module(): PostHog {\n init_type = InitType.INIT_MODULE\n ;(posthog_master as any) = new PostHog()\n\n override_ph_init_func()\n ;(posthog_master['init'] as any)()\n add_dom_loaded_handler()\n\n return posthog_master as any\n}\n", "import { RequestQueueScaffold } from './base-request-queue'\nimport { encodePostData, xhr } from './send-request'\nimport { CaptureMetrics } from './capture-metrics'\nimport { QueuedRequestData, RetryQueueElement } from './types'\nimport Config from './config'\n\nexport class RetryQueue extends RequestQueueScaffold {\n captureMetrics: CaptureMetrics\n queue: RetryQueueElement[]\n isPolling: boolean\n areWeOnline: boolean\n onXHRError: (failedRequest: XMLHttpRequest) => void\n\n constructor(captureMetrics: CaptureMetrics, onXHRError: (failedRequest: XMLHttpRequest) => void) {\n super()\n this.captureMetrics = captureMetrics\n this.isPolling = false\n this.queue = []\n this.areWeOnline = true\n this.onXHRError = onXHRError\n\n if (typeof window !== 'undefined' && 'onLine' in window.navigator) {\n this.areWeOnline = window.navigator.onLine\n window.addEventListener('online', () => {\n this._handleWeAreNowOnline()\n })\n window.addEventListener('offline', () => {\n this.areWeOnline = false\n })\n }\n }\n\n enqueue(requestData: QueuedRequestData): void {\n const retriesPerformedSoFar = requestData.retriesPerformedSoFar || 0\n if (retriesPerformedSoFar >= 10) {\n return\n }\n const msToNextRetry = 3000 * 2 ** retriesPerformedSoFar\n const retryAt = new Date(Date.now() + msToNextRetry)\n console.warn(`Enqueued failed request for retry in ${msToNextRetry}`)\n this.queue.push({ retryAt, requestData })\n if (!this.isPolling) {\n this.isPolling = true\n this.poll()\n }\n }\n\n poll(): void {\n this._poller && clearTimeout(this._poller)\n this._poller = setTimeout(() => {\n if (this.areWeOnline && this.queue.length > 0) {\n this.flush()\n }\n this.poll()\n }, this._pollInterval) as any as number\n }\n\n flush(): void {\n // using Date.now to make tests easier as recommended here https://codewithhugo.com/mocking-the-current-date-in-jest-tests/\n const now = new Date(Date.now())\n const toFlush = this.queue.filter(({ retryAt }) => retryAt < now)\n if (toFlush.length > 0) {\n this.queue = this.queue.filter(({ retryAt }) => retryAt >= now)\n for (const { requestData } of toFlush) {\n this._executeXhrRequest(requestData)\n }\n }\n }\n\n unload(): void {\n if (this._poller) {\n clearTimeout(this._poller)\n this._poller = undefined\n }\n for (const { requestData } of this.queue) {\n const { url, data, options } = requestData\n try {\n window.navigator.sendBeacon(url, encodePostData(data, { ...options, sendBeacon: true }))\n } catch (e) {\n // Note sendBeacon automatically retries, and after the first retry it will loose reference to contextual `this`.\n // This means in some cases `this.getConfig` will be undefined.\n if (Config.DEBUG) {\n console.error(e)\n }\n }\n }\n this.queue = []\n }\n\n _executeXhrRequest({ url, data, options, headers, callback, retriesPerformedSoFar }: QueuedRequestData): void {\n xhr({\n url,\n data: data || {},\n options: options || {},\n headers: headers || {},\n retriesPerformedSoFar: retriesPerformedSoFar || 0,\n callback,\n captureMetrics: this.captureMetrics,\n retryQueue: this,\n onXHRError: this.onXHRError,\n })\n }\n\n _handleWeAreNowOnline(): void {\n this.areWeOnline = true\n this.flush()\n }\n}\n", "import { PostHogPersistence, SESSION_ID } from './posthog-persistence'\nimport { sessionStore } from './storage'\nimport { _UUID } from './utils'\nimport { PostHogConfig } from './types'\n\nconst SESSION_CHANGE_THRESHOLD = 30 * 60 * 1000 // 30 mins\nconst SESSION_LENGTH_LIMIT = 24 * 3600 * 1000 // 24 hours\n\nexport class SessionIdManager {\n persistence: PostHogPersistence\n _windowId: string | null | undefined\n _sessionId: string | null | undefined\n window_id_storage_key: string\n primary_window_exists_storage_key: string\n _sessionStartTimestamp: number | null\n _sessionActivityTimestamp: number | null\n\n constructor(config: Partial, persistence: PostHogPersistence) {\n this.persistence = persistence\n this._windowId = undefined\n this._sessionId = undefined\n this._sessionStartTimestamp = null\n this._sessionActivityTimestamp = null\n\n const persistenceName = config['persistence_name'] || config['token']\n\n this.window_id_storage_key = 'ph_' + persistenceName + '_window_id'\n this.primary_window_exists_storage_key = 'ph_' + persistenceName + '_primary_window_exists'\n\n // primary_window_exists is set when the DOM has been loaded and is cleared on unload\n // if it exists here it means there was no unload which suggests this window is opened as a tab duplication, window.open, etc.\n if (!this.persistence.disabled && sessionStore.is_supported()) {\n const lastWindowId = sessionStore.parse(this.window_id_storage_key)\n\n const primaryWindowExists = sessionStore.parse(this.primary_window_exists_storage_key)\n if (lastWindowId && !primaryWindowExists) {\n // Persist window from previous storage state\n this._windowId = lastWindowId\n } else {\n // Wipe any reference to previous window id\n sessionStore.remove(this.window_id_storage_key)\n }\n // Flag this session as having a primary window\n sessionStore.set(this.primary_window_exists_storage_key, true)\n }\n\n this._listenToReloadWindow()\n }\n\n // Note: this tries to store the windowId in sessionStorage. SessionStorage is unique to the current window/tab,\n // and persists page loads/reloads. So it's uniquely suited for storing the windowId. This function also respects\n // when persistence is disabled (by user config) and when sessionStorage is not supported (it *should* be supported on all browsers),\n // and in that case, it falls back to memory (which sadly, won't persist page loads)\n _setWindowId(windowId: string): void {\n if (windowId !== this._windowId) {\n this._windowId = windowId\n if (!this.persistence.disabled && sessionStore.is_supported()) {\n sessionStore.set(this.window_id_storage_key, windowId)\n }\n }\n }\n\n _getWindowId(): string | null {\n if (this._windowId) {\n return this._windowId\n }\n if (!this.persistence.disabled && sessionStore.is_supported()) {\n return sessionStore.parse(this.window_id_storage_key)\n }\n // New window id will be generated\n return null\n }\n\n // Note: 'this.persistence.register' can be disabled in the config.\n // In that case, this works by storing sessionId and the timestamp in memory.\n _setSessionId(\n sessionId: string | null,\n sessionActivityTimestamp: number | null,\n sessionStartTimestamp: number | null\n ): void {\n if (\n sessionId !== this._sessionId ||\n sessionActivityTimestamp !== this._sessionActivityTimestamp ||\n sessionStartTimestamp !== this._sessionStartTimestamp\n ) {\n this._sessionStartTimestamp = sessionStartTimestamp\n this._sessionActivityTimestamp = sessionActivityTimestamp\n this._sessionId = sessionId\n this.persistence.register({\n [SESSION_ID]: [sessionActivityTimestamp, sessionId, sessionStartTimestamp],\n })\n }\n }\n\n _getSessionId(): [number, string, number] {\n if (this._sessionId && this._sessionActivityTimestamp && this._sessionStartTimestamp) {\n return [this._sessionActivityTimestamp, this._sessionId, this._sessionStartTimestamp]\n }\n const sessionId = this.persistence.props[SESSION_ID]\n\n if (Array.isArray(sessionId) && sessionId.length === 2) {\n // Storage does not yet have a session start time. Add the last activity timestamp as the start time\n sessionId.push(sessionId[0])\n }\n\n return sessionId || [0, null, 0]\n }\n\n // Resets the session id by setting it to null. On the subsequent call to checkAndGetSessionAndWindowId,\n // new ids will be generated.\n resetSessionId(): void {\n this._setSessionId(null, null, null)\n }\n\n /*\n * Listens to window unloads and removes the primaryWindowExists key from sessionStorage.\n * Reloaded or fresh tabs created after a DOM unloads (reloading the same tab) WILL NOT have this primaryWindowExists flag in session storage.\n * Cloned sessions (new tab, tab duplication, window.open(), ...) WILL have this primaryWindowExists flag in their copied session storage.\n * We conditionally check the primaryWindowExists value in the constructor to decide if the window id in the last session storage should be carried over.\n */\n _listenToReloadWindow(): void {\n window.addEventListener('beforeunload', () => {\n if (!this.persistence.disabled && sessionStore.is_supported()) {\n sessionStore.remove(this.primary_window_exists_storage_key)\n }\n })\n }\n\n /*\n * This function returns the current sessionId and windowId. It should be used to\n * access these values over directly calling `._sessionId` or `._windowId`. In addition\n * to returning the sessionId and windowId, this function also manages cycling the\n * sessionId and windowId when appropriate by doing the following:\n *\n * 1. If the sessionId or windowId is not set, it will generate a new one and store it.\n * 2. If the readOnly param is set to false, it will:\n * a. Check if it has been > SESSION_CHANGE_THRESHOLD since the last call with this flag set.\n * If so, it will generate a new sessionId and store it.\n * b. Update the timestamp stored with the sessionId to ensure the current session is extended\n * for the appropriate amount of time.\n *\n * @param {boolean} readOnly (optional) Defaults to False. Should be set to True when the call to the function should not extend or cycle the session (e.g. being called for non-user generated events)\n * @param {Number} timestamp (optional) Defaults to the current time. The timestamp to be stored with the sessionId (used when determining if a new sessionId should be generated)\n */\n checkAndGetSessionAndWindowId(readOnly = false, _timestamp: number | null = null) {\n const timestamp = _timestamp || new Date().getTime()\n\n // eslint-disable-next-line prefer-const\n let [lastTimestamp, sessionId, startTimestamp] = this._getSessionId()\n let windowId = this._getWindowId()\n\n const sessionPastMaximumLength =\n startTimestamp && startTimestamp > 0 && Math.abs(timestamp - startTimestamp) > SESSION_LENGTH_LIMIT\n\n if (\n !sessionId ||\n (!readOnly && Math.abs(timestamp - lastTimestamp) > SESSION_CHANGE_THRESHOLD) ||\n sessionPastMaximumLength\n ) {\n sessionId = _UUID()\n windowId = _UUID()\n startTimestamp = timestamp\n } else if (!windowId) {\n windowId = _UUID()\n }\n\n const newTimestamp = lastTimestamp === 0 || !readOnly || sessionPastMaximumLength ? timestamp : lastTimestamp\n const sessionStartTimestamp = startTimestamp === 0 ? new Date().getTime() : startTimestamp\n\n this._setWindowId(windowId)\n this._setSessionId(sessionId, newTimestamp, sessionStartTimestamp)\n\n return {\n sessionId: sessionId,\n windowId: windowId,\n }\n }\n}\n", "/**\n * Integrate Sentry with PostHog. This will add a direct link to the person in Sentry, and an $exception event in PostHog\n *\n * ### Usage\n *\n * Sentry.init({\n * dsn: 'https://example',\n * integrations: [\n * new posthog.SentryIntegration(posthog)\n * ]\n * })\n *\n * @param {Object} [posthog] The posthog object\n * @param {string} [organization] Optional: The Sentry organization, used to send a direct link from PostHog to Sentry\n * @param {Number} [projectId] Optional: The Sentry project id, used to send a direct link from PostHog to Sentry\n * @param {string} [prefix] Optional: Url of a self-hosted sentry instance (default: https://sentry.io/organizations/)\n */\n\nimport { Properties } from '../types'\nimport { PostHog } from '../posthog-core'\n\n// NOTE - we can't import from @sentry/types because it changes frequently and causes clashes\n// We only use a small subset of the types, so we can just define the integration overall and use any for the rest\n\n// import {\n// Event as _SentryEvent,\n// EventProcessor as _SentryEventProcessor,\n// Hub as _SentryHub,\n// Integration as _SentryIntegration,\n// } from '@sentry/types'\n\n// Uncomment the above and comment the below to get type checking for development\n\ntype _SentryEvent = any\ntype _SentryEventProcessor = any\ntype _SentryHub = any\n\ninterface _SentryIntegration {\n name: string\n setupOnce(addGlobalEventProcessor: (callback: _SentryEventProcessor) => void, getCurrentHub: () => _SentryHub): void\n}\n\nexport class SentryIntegration implements _SentryIntegration {\n name: string\n\n setupOnce: (\n addGlobalEventProcessor: (callback: _SentryEventProcessor) => void,\n getCurrentHub: () => _SentryHub\n ) => void\n\n constructor(_posthog: PostHog, organization?: string, projectId?: number, prefix?: string) {\n // setupOnce gets called by Sentry when it intializes the plugin\n this.name = 'posthog-js'\n this.setupOnce = function (addGlobalEventProcessor: (callback: _SentryEventProcessor) => void) {\n addGlobalEventProcessor((event: _SentryEvent) => {\n if (event.level !== 'error' || !_posthog.__loaded) return event\n if (!event.tags) event.tags = {}\n const host = _posthog.config.ui_host || _posthog.config.api_host\n event.tags['PostHog Person URL'] = host + '/person/' + _posthog.get_distinct_id()\n if (_posthog.sessionRecordingStarted()) {\n event.tags['PostHog Recording URL'] =\n host + '/recordings/' + _posthog.sessionManager.checkAndGetSessionAndWindowId(true).sessionId\n }\n const exceptions = event.exception?.values || []\n const data: Properties = {\n $sentry_event_id: event.event_id,\n $sentry_exception: event.exception,\n $sentry_exception_message: exceptions[0]?.value,\n $sentry_exception_type: exceptions[0]?.type,\n $sentry_tags: event.tags,\n }\n if (organization && projectId)\n data['$sentry_url'] =\n (prefix || 'https://sentry.io/organizations/') +\n organization +\n '/issues/?project=' +\n projectId +\n '&query=' +\n event.event_id\n _posthog.capture('$exception', data)\n return event\n })\n }\n }\n}\n", "/**\n * Extend Segment with extra PostHog JS functionality. Required for things like Recordings and feature flags to work correctly.\n *\n * ### Usage\n *\n * ```js\n * // After your standard segment anyalytics install\n * analytics.load(\"GOEDfA21zZTtR7clsBuDvmBKAtAdZ6Np\");\n *\n * analytics.ready(() => {\n * posthog.init('', {\n * capture_pageview: false,\n * segment: window.analytics, // NOTE: Be sure to use window.analytics here!\n * });\n * window.analytics.page();\n * })\n * ```\n */\nimport { PostHog } from '../posthog-core'\n\n// Loosely based on https://github.com/segmentio/analytics-next/blob/master/packages/core/src/plugins/index.ts\ninterface SegmentPluginContext {\n event: {\n event: string\n userId?: string\n anonymousId?: string\n properties: any\n }\n}\n\ninterface SegmentPlugin {\n name: string\n version: string\n type: 'enrichment'\n isLoaded: () => boolean\n load: (ctx: SegmentPluginContext, instance: any, config?: any) => Promise\n unload?: (ctx: SegmentPluginContext, instance: any) => Promise | unknown\n ready?: () => Promise\n track?: (ctx: SegmentPluginContext) => Promise | SegmentPluginContext\n identify?: (ctx: SegmentPluginContext) => Promise | SegmentPluginContext\n page?: (ctx: SegmentPluginContext) => Promise | SegmentPluginContext\n group?: (ctx: SegmentPluginContext) => Promise | SegmentPluginContext\n alias?: (ctx: SegmentPluginContext) => Promise | SegmentPluginContext\n screen?: (ctx: SegmentPluginContext) => Promise | SegmentPluginContext\n}\n\nexport const createSegmentIntegration = (posthog: PostHog): SegmentPlugin => {\n const enrichEvent = (ctx: SegmentPluginContext, eventName: string) => {\n if (!ctx.event.userId && ctx.event.anonymousId !== posthog.get_distinct_id()) {\n // This is our only way of detecting that segment's analytics.reset() has been called so we also call it\n posthog.reset()\n }\n if (ctx.event.userId && ctx.event.userId !== posthog.get_distinct_id()) {\n posthog.register({\n distinct_id: ctx.event.userId,\n })\n posthog.reloadFeatureFlags()\n }\n\n const additionalProperties = posthog._calculate_event_properties(eventName, ctx.event.properties)\n ctx.event.properties = Object.assign({}, additionalProperties, ctx.event.properties)\n return ctx\n }\n\n return {\n name: 'PostHog JS',\n type: 'enrichment',\n version: '1.0.0',\n isLoaded: () => true,\n load: () => Promise.resolve(),\n track: (ctx) => enrichEvent(ctx, ctx.event.event),\n page: (ctx) => enrichEvent(ctx, '$pageview'),\n identify: (ctx) => enrichEvent(ctx, '$identify'),\n screen: (ctx) => enrichEvent(ctx, '$screen'),\n }\n}\n", "import { _UUID } from './utils'\n\nexport class PageViewIdManager {\n _pageViewId: string | undefined\n\n _seenFirstPageView = false\n\n onPageview(): void {\n // As the first $pageview event may come after a different event,\n // we only reset the ID _after_ the second $pageview event.\n if (this._seenFirstPageView) {\n this._pageViewId = _UUID()\n }\n this._seenFirstPageView = true\n }\n\n getPageViewId(): string {\n if (!this._pageViewId) {\n this._pageViewId = _UUID()\n }\n\n return this._pageViewId\n }\n}\n", "import { LZString } from './lz-string'\nimport { gzipSync, strToU8 } from 'fflate'\nimport { _base64Encode } from './utils'\nimport { Compression, CompressionData, XHROptions } from './types'\n\nexport function decideCompression(compressionSupport: Partial>): Compression {\n if (compressionSupport[Compression.GZipJS]) {\n return Compression.GZipJS\n } else if (compressionSupport[Compression.LZ64]) {\n return Compression.LZ64\n } else {\n return Compression.Base64\n }\n}\n\nexport function compressData(\n compression: Compression,\n jsonData: string,\n options: XHROptions\n): [CompressionData | Uint8Array, XHROptions] {\n if (compression === Compression.LZ64) {\n return [{ data: LZString.compressToBase64(jsonData), compression: Compression.LZ64 }, options]\n } else if (compression === Compression.GZipJS) {\n // :TRICKY: This returns an UInt8Array. We don't encode this to a string - returning a blob will do this for us.\n return [\n gzipSync(strToU8(jsonData), { mtime: 0 }),\n { ...options, blob: true, urlQueryArgs: { compression: Compression.GZipJS } },\n ]\n } else {\n return [{ data: _base64Encode(jsonData) }, options]\n }\n}\n" ], "names": [ "f", "String", "fromCharCode", "keyStrBase64", "keyStrUriSafe", "baseReverseDic", "getBaseValue", "alphabet", "character", "i", "length", "charAt", "LZString", "compressToBase64", "input", "res", "_compress", "a", "decompressFromBase64", "_decompress", "index", "compressToUTF16", "decompressFromUTF16", "compressed", "charCodeAt", "compressToUint8Array", "uncompressed", "compress", "buf", "Uint8Array", "TotalLen", "current_value", "decompressFromUint8Array", "decompress", "Array", "result", "forEach", "c", "push", "join", "compressToEncodedURIComponent", "decompressFromEncodedURIComponent", "replace", "bitsPerChar", "getCharFromInt", "value", "ii", "context_c", "context_wc", "context_w", "context_enlargeIn", "context_dictSize", "context_numBits", "context_data_val", "context_data_position", "context_dictionary", "context_dictionaryToCreate", "context_data", "Object", "prototype", "hasOwnProperty", "call", "Math", "pow", "resetValue", "getNextValue", "w", "bits", "resb", "maxpower", "power", "dictionary", "data", "val", "position", "enlargeIn", "dictSize", "numBits", "entry", "Config", "DEBUG", "LIB_VERSION", "ArrayProto", "ObjProto", "toString", "win", "window", "navigator", "userAgent", "document", "nativeForEach", "nativeIndexOf", "indexOf", "nativeIsArray", "isArray", "breaker", "logger", "log", "_isUndefined", "console", "_len", "arguments", "args", "_key", "apply", "err", "_eachArray", "arg", "error", "_len2", "_args", "_key2", "critical", "_len3", "_key3", "_trim", "str", "_each", "obj", "iterator", "thisArg", "l", "key", "_extend", "_len4", "_key5", "source", "prop", "_isArray", "_isFunction", "test", "x", "_includes", "needle", "_isObject", "_isString", "_isNumber", "_encodeDates", "v", "k", "_isDate", "_formatDate", "d", "pad", "n", "getUTCFullYear", "getUTCMonth", "getUTCDate", "getUTCHours", "getUTCMinutes", "getUTCSeconds", "_safewrap", "_len5", "_key7", "this", "e", "_strip_empty_properties", "p", "ret", "LONG_STRINGS_ALLOW_LIST", "_copyAndTruncateStrings", "object", "maxStringLength", "customizer", "slice", "COPY_IN_PROGRESS_SET", "Set", "internalDeepCircularCopy", "has", "add", "it", "_base64Encode", "h1", "h2", "h3", "h4", "b64", "ac", "enc", "tmp_arr", "_utf8Encode", "T", "string", "start", "end", "stringl", "utftext", "c1", "substring", "_UUID", "Date", "valueOf", "se", "screen", "height", "width", "random", "ch", "ua", "buffer", "xor", "byte_array", "j", "tmp", "unshift", "UA", "_isBlockedUA", "_getQueryParam", "url", "param", "cleanParam", "results", "RegExp", "exec", "decodeURIComponent", "_getHashParam", "hash", "matches", "match", "_register_event", "fixEvent", "event", "preventDefault", "stopPropagation", "returnValue", "cancelBubble", "element", "type", "handler", "oldSchool", "useCapture", "addEventListener", "ontype", "old_handler", "new_handler", "old_handlers", "old_result", "new_result", "makeHandler", "_info", "campaignParams", "campaign_keywords", "split", "params", "kwkey", "kw", "URL", "searchEngine", "referrer", "search", "searchInfo", "keyword", "browser", "user_agent", "vendor", "opera", "browserVersion", "regex", "Chrome", "Safari", "Opera", "Firefox", "Konqueror", "BlackBerry", "Mozilla", "undefined", "parseFloat", "browserLanguage", "language", "userLanguage", "os", "device", "deviceType", "referringDomain", "properties", "$os", "$browser", "$device", "$device_type", "$current_url", "location", "href", "$host", "host", "$pathname", "pathname", "$browser_version", "$browser_language", "$screen_height", "$screen_width", "$viewport_height", "innerHeight", "$viewport_width", "innerWidth", "$lib", "$lib_version", "$insert_id", "$time", "now", "people_properties", "getClassName", "el", "className", "baseVal", "getAttribute", "getSafeText", "elText", "shouldCaptureElement", "isSensitiveElement", "childNodes", "child", "isTextNode", "textContent", "filter", "shouldCaptureValue", "isElementNode", "nodeType", "isTag", "tag", "tagName", "toLowerCase", "isDocumentFragment", "autocaptureCompatibleElements", "curEl", "parentNode", "classes", "name", "id", "includes", "loadScript", "scriptUrlToLoad", "callback", "scriptTag", "createElement", "src", "onload", "_scripts$0$parentNode", "scripts", "querySelectorAll", "insertBefore", "body", "appendChild", "getDirectAndNestedSpanText", "target", "text", "concatenateStringsWithSpace", "getNestedSpanText", "_target$children", "children", "_step", "_iterator", "s", "done", "spanText", "strings", "RageClick", "enabled", "_classCallCheck", "clicks", "y", "timestamp", "lastClick", "abs", "autocapture", "_initializedTokens", "_previousElementSibling", "previousElementSibling", "_el", "previousSibling", "_getAugmentPropertiesFromElement", "elem", "props", "attributes", "attr", "startsWith", "propertyKey", "propertyValue", "_getPropertiesFromElement", "maskInputs", "maskText", "tag_name", "attributeName", "nthChild", "nthOfType", "currentElem", "_getDefaultProperties", "eventType", "$event_type", "$ce_version", "_extractCustomPropertyValue", "customProperty", "propValues", "matchedElem", "_getCustomProperties", "targetElementList", "_this", "_customProperties", "eventSelector", "eventElement", "_getEventTarget", "srcElement", "_e$target", "shadowRoot", "composedPath", "_captureEvent", "instance", "_this$rageclicks", "_this2", "eventName", "MouseEvent", "rageclicks", "isRageClick", "clientX", "clientY", "getTime", "autocaptureConfig", "url_allowlist", "allowlist", "some", "dom_event_allowlist", "element_allowlist", "elementType", "css_selector_allowlist", "selector", "parentIsUsefulElement", "compStyles", "getComputedStyle", "getPropertyValue", "shouldCaptureDomEvent", "config", "elementsJson", "autocaptureAugmentProperties", "explicitNoCapture", "shouldCaptureEl", "get_config", "augmentProperties", "$elements", "capture", "_navigate", "_addDomEventHandlers", "_this3", "init", "_this$config", "__autocapture", "map", "afterDecideResponse", "response", "token", "enabledForProject", "numBuckets", "numEnabledBuckets", "charCodeSum", "isBrowserSupported", "func", "bind", "_bind_instance_methods", "_safewrap_instance_methods", "DOMAIN_MATCH_REGEX", "cookieStore", "is_supported", "msg", "get", "nameEQ", "ca", "cookie", "parse", "JSON", "set", "days", "cross_subdomain", "is_secure", "cdomain", "expires", "secure", "hostname", "domain", "date", "setTime", "toUTCString", "new_cookie_val", "encodeURIComponent", "stringify", "remove", "_localStorage_supported", "localStore", "supported", "localStorage", "getItem", "setItem", "removeItem", "localPlusCookieStore", "_objectSpread", "extend", "distinct_id", "memoryStorage", "memoryStore", "sessionStorageSupported", "sessionStore", "sessionStorage", "GDPR_DEFAULT_PERSISTENCE_PREFIX", "optIn", "options", "_optInOut", "optOut", "hasOptedIn", "_getStorageValue", "hasOptedOut", "respectDnt", "nav", "hasDntOn", "dntValue", "_hasDoNotTrackFlagOn", "clearOptInOut", "_getStorage", "_getStorageKey", "crossSubdomainCookie", "persistenceType", "persistencePrefix", "optValue", "cookieExpiration", "secureCookie", "captureEventName", "captureProperties", "send_instantly", "userOptedOut", "posthog", "silenceErrors", "optedOut", "addOptOutCheck", "method", "SET_ACTION", "PostHogPeople", "_posthog", "to", "set_action", "_get_config", "persistence", "update_referrer_info", "get_referrer_info", "_send_request", "set_once", "set_once_action", "get_distinct_id", "device_id", "get_property", "user_id", "had_persisted_distinct_id", "date_encoded_data", "truncated_data", "encoded_data", "_prepare_callback", "conf_var", "apiActionParser", "actionType", "_is_reserved_property", "PERSISTENCE_ACTIVE_FEATURE_FLAGS", "PERSISTENCE_ENABLED_FEATURE_FLAGS", "PERSISTENCE_OVERRIDE_FEATURE_FLAGS", "PERSISTENCE_FEATURE_FLAG_PAYLOADS", "PostHogFeatureFlags", "_override_warning", "flagCallReported", "featureFlagEventHandlers", "reloadFeatureFlagsQueued", "reloadFeatureFlagsInAction", "_createClass", "keys", "getFlagVariants", "enabledFlags", "overriddenFlags", "finalFlags", "overriddenKeys", "warn", "_startReloadTimer", "anon_distinct_id", "$anon_distinct_id", "isPaused", "setTimeout", "_reloadFeatureFlagsRequest", "setReloadingPaused", "groups", "getGroups", "receivedFeatureFlags", "getFlags", "flagValue", "send_event", "$feature_flag", "$feature_flag_response", "getFlagPayloads", "getFeatureFlag", "h", "decideEndpointWasHit", "currentFlags", "currentFlagPayloads", "flags", "flagPayloads", "_persistence$register", "$enabled_feature_flags", "register", "_persistence$register2", "newFeatureFlags", "newFeatureFlagPayloads", "errorsWhileComputingFlags", "_defineProperty", "unregister", "parseFeatureFlagDecideResponse", "_this$_prepareFeature", "_prepareFeatureFlagsForCallbacks", "flagVariants", "flagsObj", "addFeatureFlagsHandler", "_this$_prepareFeature2", "removeFeatureFlagsHandler", "flag", "variantKey", "reduce", "PEOPLE_DISTINCT_ID_KEY", "ALIAS_ID_KEY", "EVENT_TIMERS_KEY", "SESSION_RECORDING_ENABLED_SERVER_SIDE", "CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE", "SESSION_RECORDING_RECORDER_VERSION_SERVER_SIDE", "SESSION_ID", "ENABLED_FEATURE_FLAGS", "USER_STATE", "RESERVED_PROPERTIES", "PostHogPersistence", "campaign_params_saved", "storage_type", "storage", "user_state", "load", "update_config", "save", "_typeof", "found", "disabled", "expire_days", "default_value", "default_expiry", "hasChanges", "$referrer", "$referring_domain", "set_disabled", "set_cross_subdomain", "set_secure", "event_name", "timers", "state", "replacementImageURI", "FULL_SNAPSHOT_EVENT_TYPE", "META_EVENT_TYPE", "PLUGIN_EVENT_TYPE", "CONSOLE_LOG_PLUGIN_NAME", "BASE_ENDPOINT", "SessionRecording", "captureStarted", "snapshots", "emit", "endpoint", "stopRrweb", "windowId", "sessionId", "receivedDecide", "isRecordingEnabled", "startCaptureAndTrySendingQueuedSnapshots", "stopRecording", "enabled_server_side", "enabled_client_side", "_this$instance$get_co", "recordingVersion_server_side", "recorderVersion", "_response$sessionReco3", "_response$sessionReco5", "_response$sessionReco", "_response$sessionReco2", "_this$instance$persis", "_response$sessionReco4", "sessionRecording", "consoleLogRecordingEnabled", "startRecordingIfEnabled", "_captureSnapshot", "_startCapture", "assign", "recorderJS", "getRecordingVersion", "__loaded_recorder_version", "_onScriptLoaded", "_event$data", "_this$rrwebRecord", "isNotUserInteraction", "_this$instance$sessio", "sessionManager", "checkAndGetSessionAndWindowId", "rrwebRecord", "takeFullSnapshot", "_this$rrwebRecord2", "sessionRecordingOptions", "blockClass", "blockSelector", "ignoreClass", "maskAllInputs", "maskInputOptions", "maskInputFn", "slimDOMOptions", "collectFonts", "inlineStylesheet", "rrweb", "record", "userSessionRecordingOptions", "entries", "_i", "_Object$entries", "_Object$entries$_i", "_slicedToArray", "plugin", "payload", "updatedPayload", "truncateLargeConsoleLogs", "stringifiedData", "_createForOfIteratorHelper", "matchAll", "toLocaleLowerCase", "filterDataURLsFromLargeDataObjects", "_updateWindowAndSessionIds", "$snapshot_data", "$session_id", "$window_id", "_captureMetrics", "incr", "concat", "plugins", "rrwebConsoleRecord", "isConsoleLogCaptureEnabled", "getRecordConsolePlugin", "_addCaptureHook", "_this2$rrwebRecord", "addCustomEvent", "transport", "_noTruncate", "_batchKey", "_metrics", "rrweb_full_snapshot", "PERFORMANCE_EVENTS_MAPPING", "entryType", "timeOrigin", "startTime", "redirectStart", "redirectEnd", "workerStart", "fetchStart", "domainLookupStart", "domainLookupEnd", "connectStart", "secureConnectionStart", "connectEnd", "requestStart", "responseStart", "responseEnd", "decodedBodySize", "encodedBodySize", "initiatorType", "nextHopProtocol", "renderBlockingStatus", "responseStatus", "transferSize", "renderTime", "loadTime", "size", "domComplete", "domContentLoadedEvent", "domInteractive", "loadEventEnd", "loadEventStart", "redirectCount", "navigationType", "unloadEventEnd", "unloadEventStart", "duration", "ENTRY_TYPES_TO_OBSERVE", "POSTHOG_PATHS_TO_IGNORE", "WebPerformanceObserver", "isEnabled", "startObserving", "stopObserving", "observer", "PerformanceObserver", "list", "getEntries", "_capturePerformanceEvent", "entryTypes", "supportedEntryTypes", "_this$observer", "observe", "buffered", "disconnect", "_ref", "remoteEnabled", "capturePerformance", "path", "find", "eventJson", "toJSON", "floor", "performance", "capturePerformanceEvent", "exposesServerTiming", "serverTiming", "_this$capturePerforma", "timing", "Decide", "_hasBootstrappedFeatureFlags", "verbose", "parseDecideResponse", "_this$instance$webPer", "status", "toolbar", "webPerformance", "featureFlags", "compression", "_step2", "apiHost", "_loop", "_step2$value", "script", "onerror", "_iterator2", "POSTHOG_MANAGED_HOSTS", "Toolbar", "toolbarParams", "toolbarVersion", "loadToolbar", "apiURL", "history", "stateHash", "replaceState", "title", "userIntent", "timestampToNearestThirtySeconds", "toolbarUrl", "endsWith", "disableToolbarMetrics", "jsURL", "instrument", "paramsToPersist", "_objectWithoutProperties", "_excluded", "maybeLoadToolbar", "RequestQueueScaffold", "pollInterval", "isPolling", "_event_queue", "_empty_queue_count", "_poller", "_pollInterval", "interval", "poll", "RequestQueue", "_RequestQueueScaffold", "_inherits", "_super", "_createSuper", "captureMetrics", "handlePollRequest", "clearTimeout", "requests", "formatQueue", "_", "dataKey", "requestValues", "values", "r", "request", "CaptureMetrics", "metrics", "by", "u8", "u16", "Uint16Array", "u32", "Uint32Array", "fleb", "fdeb", "clim", "freb", "eb", "b", "_a", "fl", "revfl", "_b", "revfd", "rev", "hMap", "cd", "mb", "co", "le", "rvb", "sv", "r_1", "m", "flt", "fdt", "flm", "Compression", "fdm", "shft", "slc", "subarray", "wbits", "o", "wbits16", "hTree", "t", "t2", "sort", "i0", "i1", "i2", "maxSym", "tr", "mbt", "ln", "dt", "lft", "cst", "i2_1", "i2_2", "i2_3", "max", "lc", "cl", "cli", "cln", "cls", "clen", "cf", "wfblk", "out", "pos", "dat", "wblk", "final", "syms", "lf", "df", "li", "bs", "bl", "dlt", "mlb", "ddt", "mdb", "_c", "lclt", "nlc", "_d", "lcdt", "ndc", "lcfreq", "_e", "lct", "mlcb", "nlcc", "lm", "ll", "dm", "dl", "flen", "ftlen", "dtlen", "llm", "lcts", "clct", "len", "dst", "deo", "et", "crct", "crc", "cr", "dopt", "opt", "pre", "post", "st", "lvl", "plvl", "lst", "msk_1", "prev", "head", "bs1_1", "ceil", "bs2_1", "hsh", "lc_1", "wi", "hv", "imod", "pimod", "rem", "ch_1", "dif", "maxn", "min", "maxd", "ml", "nl", "mmd", "md", "ti", "lin", "din", "dflt", "level", "mem", "wbytes", "gzh", "fn", "filename", "mtime", "gzhl", "gzipSync", "opts", "strToU8", "latin1", "TextEncoder", "encode", "ar", "ai", "InitType", "init_type", "posthog_master", "addParamsToURL", "urlQueryArgs", "parameterOptions", "halves", "argSeparator", "formdata", "use_val", "use_key", "arg_separator", "tph_arr", "_HTTPBuildQuery", "encodePostData", "blob", "Blob", "sendBeacon", "body_data", "xhr", "headers", "retriesPerformedSoFar", "retryQueue", "onXHRError", "_ref$timeout", "timeout", "req", "XMLHttpRequest", "open", "headerValue", "headerName", "setRequestHeader", "withCredentials", "onreadystatechange", "readyState", "decr", "responseText", "enqueue", "send", "RetryQueue", "queue", "areWeOnline", "onLine", "_handleWeAreNowOnline", "requestData", "msToNextRetry", "retryAt", "flush", "toFlush", "_ref2", "_executeXhrRequest", "_ref3", "SESSION_CHANGE_THRESHOLD", "SESSION_LENGTH_LIMIT", "SessionIdManager", "_windowId", "_sessionId", "_sessionStartTimestamp", "_sessionActivityTimestamp", "persistenceName", "window_id_storage_key", "primary_window_exists_storage_key", "lastWindowId", "primaryWindowExists", "_listenToReloadWindow", "sessionActivityTimestamp", "sessionStartTimestamp", "_setSessionId", "readOnly", "_this$_getSessionId2", "_getSessionId", "lastTimestamp", "startTimestamp", "_getWindowId", "sessionPastMaximumLength", "newTimestamp", "_setWindowId", "SentryIntegration", "organization", "projectId", "prefix", "setupOnce", "addGlobalEventProcessor", "_event$exception", "_exceptions$", "_exceptions$2", "__loaded", "tags", "ui_host", "api_host", "sessionRecordingStarted", "exceptions", "exception", "$sentry_event_id", "event_id", "$sentry_exception", "$sentry_exception_message", "$sentry_exception_type", "$sentry_tags", "createSegmentIntegration", "enrichEvent", "ctx", "userId", "anonymousId", "reset", "reloadFeatureFlags", "additionalProperties", "_calculate_event_properties", "version", "isLoaded", "Promise", "resolve", "track", "page", "identify", "PageViewIdManager", "_seenFirstPageView", "_pageViewId", "__NOOP", "__NOOPTIONS", "PRIMARY_INSTANCE_NAME", "USE_XHR", "ENQUEUE_REQUESTS", "defaultConfig", "_document$location", "_document$location$ho", "_window$location", "api_method", "api_transport", "rageclick", "cross_subdomain_cookie", "persistence_name", "cookie_name", "loaded", "store_google", "save_referrer", "img", "capture_pageview", "capture_pageleave", "debug", "cookie_expiration", "upgrade", "disable_session_recording", "disable_persistence", "disable_cookie", "enable_recording_console_log", "secure_cookie", "protocol", "ip", "opt_out_capturing_by_default", "opt_out_persistence_by_default", "opt_out_capturing_persistence_type", "opt_out_capturing_cookie_prefix", "opt_in_site_apps", "property_blacklist", "respect_dnt", "sanitize_properties", "xhr_headers", "inapp_protocol", "inapp_link_new_window", "request_batching", "properties_string_max_length", "session_recording", "mask_all_element_attributes", "mask_all_text", "advanced_disable_decide", "advanced_disable_toolbar_metrics", "on_xhr_error", "statusText", "get_device_id", "uuid", "_onCapture", "_capture_metrics", "capture_performance", "callback_fn", "bootstrap", "disable_compression", "create_mplib", "INIT_MODULE", "PostHog", "_init", "startObservingIfEnabled", "_execute_array", "people", "segmentIntegration", "__captureHooks", "__request_queue", "_jsc", "feature_flags", "pageViewIdManager", "_requestQueue", "_retryQueue", "_loaded", "_window$rrweb", "_config$bootstrap", "_window$rrweb2", "_triggered_notifs", "set_config", "_handle_queued_event", "_gdpr_init", "segment", "user", "set_user_state", "distinctID", "_config$bootstrap2", "_config$bootstrap3", "deviceID", "isIdentifiedID", "$device_id", "_config$bootstrap4", "_config$bootstrap7", "activeFlags", "_config$bootstrap5", "_config$bootstrap5$fe", "_config$bootstrap6", "_config$bootstrap6$fe", "featureFlagPayloads", "_config$bootstrap8", "_config$bootstrap8$fe", "_config$bootstrap9", "_config$bootstrap9$fe", "register_once", "self", "_handle_unload", "_start_queue_if_opted_in", "resetRequestQueue", "has_opted_out_capturing", "item", "_toConsumableArray", "jsc", "randomized_cb", "callback_string", "updateUnloadMetrics", "unload", "jsonData", "__compress_and_send_json_request", "compressionSupport", "compressData", "LZ64", "GZipJS", "Base64", "_compressData2", "_compressData", "_options", "DEFAULT_OPTIONS", "useSendBeacon", "_s$parentNode", "async", "defer", "getElementsByTagName", "array", "fn_name", "alias_calls", "other_calls", "capturing_calls", "execute", "calls", "caller", "_this$config$bootstra", "_this$config$bootstra2", "update_search_keyword", "update_campaign_params", "$set", "has_unique_traits", "_invokeCaptureHooks", "eventData", "event_properties", "_this$webPerformance", "start_timestamp", "remove_event_timer", "persistenceProps", "infoProperties", "_this$sessionManager$", "onPageview", "$pageview_id", "getPageViewId", "duration_in_ms", "toFixed", "blacklisted_prop", "property", "getFeatureFlagPayload", "_unused", "isFeatureEnabled", "onFeatureFlags", "new_distinct_id", "userPropertiesToSet", "userPropertiesToSetOnce", "previous_distinct_id", "$user_id", "$had_persisted_distinct_id", "isKnownAnonymous", "get_user_state", "$set_once", "setAnonymousDistinctId", "groupType", "groupKey", "groupPropertiesToSet", "existingGroups", "$groups", "$group_type", "$group_key", "$group_set", "reset_device_id", "clear", "resetSessionId", "alias", "original", "_register_single", "oldConfig", "_this$sessionRecordin", "started", "prop_name", "property_name", "_this$get_config", "has_opted_in_capturing", "persistence_type", "opt_in_capturing", "enable_persistence", "opt_out_capturing", "clear_persistence", "clear_opt_in_out_capturing", "_gdpr_update_persistence", "cookie_prefix", "_gdpr_call_func", "klass", "functions", "_safewrap_class", "instances", "override_ph_init_func", "INIT_SNIPPET", "add_dom_loaded_handler", "dom_loaded_handler", "inst", "_dom_loaded" ], "mappings": "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" }