@ginger-ai/ginger-js 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"ginger.esm.js","sources":["../src/core/util/generate-requestid.ts","../src/core/util/error.ts","../src/core/dto/device-detector.dto.ts","../src/core/dto/metrics.dto.ts","../src/core/dto/ginger.dto.ts","../src/core/constants.ts","../src/core/helpers.ts","../src/core/http/request.ts","../src/core/http/httpClient.ts","../src/device/modules/options.ts","../src/device/factory.ts","../src/device/utils/hash.ts","../src/device/modules/fp.ts","../src/device/utils/raceAll.ts","../src/device/modules/tor.ts","../src/device/modules/incognito.ts","../node_modules/tslib/tslib.es6.js","../node_modules/@fingerprintjs/botd/dist/botd.esm.js","../src/device/modules/bot.ts","../src/device/components/system/browser.ts","../node_modules/ua-parser-js/src/main/ua-parser.mjs","../src/device/modules/os.ts","../src/device/modules/device/helpers.ts","../src/device/modules/device/analyze-data.ts","../src/device/modules/device/index.ts","../src/device/modules/device/gather-data.ts","../src/device/modules/browserDetails.ts","../src/device/utils/commonPixels.ts","../src/device/components/audio/audio.ts","../src/device/components/canvas/canvas.ts","../src/device/utils/ephemeralIFrame.ts","../src/device/components/fonts/fonts.ts","../src/device/components/hardware/hardware.ts","../src/device/utils/getMostFrequent.ts","../src/device/components/permissions/permissions.ts","../src/device/utils/data.ts","../src/device/utils/browser_.ts","../src/device/utils/misc.ts","../src/device/components/locales/locales.ts","../src/device/components/screen/screen.ts","../src/device/components/screen/screenResolution.ts","../src/device/components/webgl/imageHash.ts","../src/device/components/system/system.ts","../src/device/components/webgl/webgl.ts","../src/device/components/plugins/plugins.ts","../src/device/components/system/emoji.ts","../src/device/components/math/math.ts","../src/device/utils/async.ts","../src/device/utils/dom.ts","../src/device/components/extra/extra.ts","../src/device/index.ts","../src/behaviour/index.ts","../src/client/index.ts"],"sourcesContent":["export const generateRequestId = (): string => {\n const timestamp = Date.now();\n const base34Alphabet = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\".slice(0, 34);\n\n const base34 = tripleRecursivebase34Alphabet(timestamp, base34Alphabet);\n const requestId = `${timestamp}.${base34}`;\n\n return requestId;\n};\n\n// Convert number to base-34 (8-character output)\nfunction toBase34(n: number, base34Alphabet: string): string {\n if (n === 0) return \"00000000\";\n\n let result = \"\";\n while (n > 0) {\n let remainder = n % 34;\n result = base34Alphabet[remainder] + result;\n n = Math.floor(n / 34);\n }\n // Pad to 8 characters\n while (result.length < 8) {\n result = \"0\" + result;\n }\n return result.slice(-8);\n}\n\n// Convert base-34 string to number\nfunction fromBase34(str: string, base34Alphabet: string): number {\n let n = 0;\n for (let char of str) {\n let value = base34Alphabet.indexOf(char.toUpperCase());\n if (value === -1) throw new Error(\"Invalid base-34 character\");\n n = n * 34 + value;\n }\n return n;\n}\n\nfunction getRandomSalt(max: number): number {\n const maxBase34 = max; // 34^8\n return Math.floor(Math.random() * maxBase34);\n}\n\n// Recursive function to encode timestamp three times with hashing\nconst tripleRecursivebase34Alphabet = (\n timestamp: number,\n base34Alphabet: string,\n count: number = 1\n): string => {\n if (count > 3) {\n return toBase34(timestamp, base34Alphabet);\n }\n const MAX_BASE_34 = 1336336003215616;\n\n const saltedTimestamp =\n (timestamp + getRandomSalt(MAX_BASE_34)) % MAX_BASE_34;\n const encoded = toBase34(saltedTimestamp, base34Alphabet);\n\n const decoded = fromBase34(encoded, base34Alphabet);\n\n // Recursive call with incremented count\n return tripleRecursivebase34Alphabet(decoded, base34Alphabet, count + 1);\n};\n","// Move to another file\ninterface GingerErrorResponse {\n /**\n * HTTP status code\n */\n status: number;\n /**\n * HTTP status text\n */\n statusText: string;\n /**\n * HTTP headers object\n */\n headers: Headers;\n}\n\nexport class GingerError extends Error {\n statusCode: number;\n response: GingerErrorResponse;\n\n constructor(message: string, statusCode: number, response: GingerErrorResponse) {\n super(message);\n this.name = \"GingerError\";\n this.statusCode = statusCode;\n this.response = response;\n }\n}\n\nexport class GingerClientError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"GingerClientError\";\n }\n}\n\nexport const handleException = async (response: Response) => {\n const jsonify = await response.json();\n const message = jsonify?.error || jsonify.message || \"An error occurred\";\n throw new GingerError(message, response.status, response);\n};\n","export const ALLOWED_OS = [\n \"ios\",\n \"android\",\n \"windows\",\n \"macos\",\n \"linux\",\n] as const;\nexport const ALLOWED_DEVICE_TYPES = [\"mobile\", \"desktop\", \"tablet\"] as const;\n\nexport type AllowedOs = (typeof ALLOWED_OS)[number];\nexport type DeviceType = (typeof ALLOWED_DEVICE_TYPES)[number] | null;\n\nexport interface BrandInfo {\n brand: string;\n version: string;\n}\n\nexport interface ClaimedDevice {\n platform: string;\n mobile: boolean;\n brands: BrandInfo[];\n guessedDeviceType: DeviceType | null;\n}\n\nexport interface ScreenInfo {\n width: number;\n height: number;\n pixelRatio: number;\n}\n\nexport interface WebGLInfo {\n vendor?: string;\n renderer?: string;\n error: string;\n}\nexport interface DeviceSignals {\n actualPlatform: string;\n touchPoints: number;\n screen: ScreenInfo;\n webGL: WebGLInfo;\n readonly userAgentString: string;\n}\n\nexport interface DeviceAnalysis {\n confidence: number;\n spoofingConfidence: number;\n isSpoofed: boolean;\n detectionConflicts: string[];\n realPlatform: AllowedOs | null;\n realDeviceType: DeviceType;\n}\nexport interface DeviceResults {\n claimed: ClaimedDevice;\n signals: DeviceSignals;\n analysis: DeviceAnalysis;\n}\n\nexport interface RefinedDeviceResults extends DeviceResults {\n deviceOs: AllowedOs | null;\n deviceType: DeviceType;\n tampering: deviceTampering;\n}\n\nexport interface deviceTampering {\n status: boolean;\n confidence?: number;\n}\n","export type FillMethod = \"typed\" | \"pasted\" | \"mixed\" | null;\n\nexport enum FillEnum {\n typed = \"typed\",\n paste = \"pasted\",\n mixed = \"mixed\",\n}\n\nexport interface FieldMetrics {\n field_name: string;\n ltm: boolean;\n started_at: number;\n ended_at: number;\n interaction_count: number;\n fill_method: FillMethod;\n paste_count: number;\n corrections_count: number;\n pauses: number;\n pauseDurations: number[];\n}\n","import { BotDetectionResult } from \"./bot-detector.dto\";\nimport { IncognitoDetectionResult } from \"./incognito-detector.dto\";\nimport { TorDetectionResult } from \"./tor-detector.dto\";\nimport { RawDeviceData } from \"./fingerprint.dto\";\nimport { deviceTampering } from \"./device-detector.dto\";\nimport { FieldMetrics } from \"./metrics.dto\";\n\ninterface Device {\n fingerprint_id: string;\n type: string;\n os: string | null;\n os_version: string | undefined;\n browserDetails: BrowserDetails;\n bot: BotDetectionResult;\n incognito: IncognitoDetectionResult;\n tor: TorDetectionResult;\n tampering: deviceTampering;\n raw_device_data: RawDeviceData;\n}\n\nexport interface BrowserDetails {\n name: string;\n version: string;\n user_agent: string;\n}\n\nexport interface Payload {\n request_id: string;\n device: Device;\n}\n\nexport const EVENT_TYPES = [\n \"login\",\n \"registration\",\n \"credentials_update\",\n \"alerts_snooze\",\n] as const;\n\nexport type ALLOWED_EVENT_TYPES = (typeof EVENT_TYPES)[number];\n\nexport interface EventParams {\n event_type: ALLOWED_EVENT_TYPES;\n request_id: string | undefined;\n fingerprint_id: string;\n}\n\nexport interface BehaviourParams extends Omit<EventParams, \"fingerprint_id\"> {\n track_fields: Field[];\n}\n\nexport interface Field {\n id: string;\n ltm?: boolean;\n}\n\nexport interface Configurations {\n apikey: string;\n}\n\nexport interface BehaviourPayload extends EventParams {\n data: {\n fields: FieldMetrics[];\n distractions_count: number;\n };\n}\n\nexport interface BehaviourPayloadResponse {\n status: string;\n message: string;\n data: BehaviourPayloadResponseData;\n}\n\nexport interface BehaviourPayloadResponseData {\n request_id: string;\n fingerprint_id: string;\n event_type: string;\n message: string;\n occured_at: string;\n}\nexport interface PayloadResponse {\n status: string;\n message: string;\n data: PayloadResponseData;\n}\n\nexport type PayloadResponseData = {\n fingerprint_id: string;\n [key: string]: string | string[] | boolean | PayloadResponseData | PayloadResponseData[] \n}\n","export const CONSTANTS = {\n LIVE_URL: \"https://app.getrayyan.com\",\n TEST_URL: \"https://test.getrayyan.com\"\n}","import { CONSTANTS } from \"./constants\";\nimport { GingerClientError } from \"./util/error\";\n\nexport default function getBasePath(apikey: string) {\n if (apikey.includes(\"sk_live\") || apikey.includes(\"pk_live\"))\n return CONSTANTS.LIVE_URL;\n \n return CONSTANTS.TEST_URL;\n}\n\nexport const pageVisibility = () => {\n let leaveCount = 0;\n\n const countPageLeaves = () => {\n if (document.visibilityState === \"hidden\") {\n leaveCount++;\n }\n };\n\n const visibilityHandler = () => countPageLeaves();\n\n return {\n getCount: () => leaveCount,\n addListener: () =>\n document.addEventListener(\"visibilitychange\", visibilityHandler),\n removeListener: () =>\n document.removeEventListener(\"visibilitychange\", visibilityHandler),\n };\n};\n\nexport const validatePresence = (key: string) => {\n if (!key) throw new GingerClientError(\"'apikey' must be provided.\");\n};\n","import { handleException } from \"../util/error\";\n\ntype Method = \"POST\" | \"GET\" | \"PUT\" | \"DELETE\";\n\nexport const makeRequest = async <Request, Response>(\n url: string,\n payload: Request,\n method: Method,\n apikey: string\n): Promise<Response> => {\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n Authorization: `Bearer ${apikey}`,\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n await handleException(response);\n }\n\n const responseJSON = await response.json();\n return responseJSON;\n } catch (error) {\n throw error;\n }\n};\n","import getBasePath, { validatePresence } from \"../helpers\";\nimport { makeRequest } from \"./request\";\n\nenum Method {\n POST = \"POST\",\n}\n\ninterface HttpOptions<T> {\n /**\n * The URL to which the request is sent.\n */\n url: string;\n /**\n * payload to send\n */\n payload: T;\n /**\n * API Method\n */\n method?: Method;\n}\n\nexport interface HttpClient {\n post<T, U>(options: HttpOptions<T>): Promise<U>;\n}\n\nexport class GingerHttpClient implements HttpClient {\n readonly basePath: string;\n readonly apikey: string;\n\n constructor(apikey: string) {\n validatePresence(apikey);\n this.basePath = getBasePath(apikey);\n this.apikey = apikey;\n }\n\n async post<T, U>(options: HttpOptions<T>): Promise<U> {\n const { url, payload, method = Method.POST } = options;\n const fullPath = `${this.basePath}${url}`;\n try {\n const response = await makeRequest<T, U>(\n fullPath,\n payload,\n method,\n this.apikey\n );\n return response;\n } catch (e) {\n throw e;\n }\n }\n}\n","export interface optionsInterface {\n exclude: string[],\n include: string[],\n webgl_runs?: number,\n canvas_runs?: number,\n permissions_to_check?: PermissionName[], // new option\n retries?: number, // new option\n timeout?: number, // new option\n logging: boolean\n}\n\nexport let options: optionsInterface = {\n exclude: [],\n include: [],\n logging: true,\n}\n\n","import { options } from './modules/options';\n\n// the component interface is the form of the JSON object the function's promise must return\nexport interface componentInterface {\n [key: string]: string | string[] | number | boolean | componentInterface;\n}\n\n\n// The component function's interface is simply the promise of the above\nexport interface componentFunctionInterface {\n (): Promise<componentInterface>;\n}\n\n// components include a dictionary of name: function.\nexport const components: {[name: string]: componentFunctionInterface} = {};\n\n\n/** \n * includeComponent is the function each component function needs to call in order for the component to be included\n * in the fingerprint.\n * @param {string} name - the name identifier of the component\n * @param {componentFunctionInterface} creationFunction - the function that implements the component\n * @returns \n */ \nexport const includeComponent = (name:string, creationFunction: componentFunctionInterface) => {\n if (typeof window !== 'undefined')\n components[name] = creationFunction;\n}\n\n\n/**\n * The function turns the map of component functions to a map of Promises when called\n * @returns {[name: string]: <Promise>componentInterface} \n */\nexport const getComponentPromises = () => {\n return Object.fromEntries(\n Object.entries(components)\n .filter(([key]) => {\n return !options?.exclude?.includes(key)}\n )\n .filter(([key]) => {\n return options?.include?.some(e => e.includes('.'))\n ? options?.include?.some(e => e.startsWith(key))\n : options?.include?.length === 0 || options?.include?.includes(key)\n }\n )\n .map(([key, value]) => [key, value()])\n );\n}\n\n\nexport const timeoutInstance: componentInterface = {\n 'timeout': \"true\"\n}\n","/**\n * This code is taken from https://github.com/LinusU/murmur-128/blob/master/index.js\n * But instead of dependencies to encode-utf8 and fmix, I've implemented them here.\n */\n\nfunction encodeUtf8(text: string): any {\n const encoder = new TextEncoder();\n return encoder.encode(text).buffer;\n}\n \nfunction fmix (input : number) : number {\n input ^= (input >>> 16)\n input = Math.imul(input, 0x85ebca6b)\n input ^= (input >>> 13)\n input = Math.imul(input, 0xc2b2ae35)\n input ^= (input >>> 16)\n\n return (input >>> 0)\n}\n \nconst C = new Uint32Array([\n 0x239b961b,\n 0xab0e9789,\n 0x38b34ae5,\n 0xa1e38b93\n])\n \nfunction rotl (m : number, n : number) : number {\n return (m << n) | (m >>> (32 - n))\n}\n \nfunction body (key : ArrayBuffer, hash : Uint32Array) {\n const blocks = (key.byteLength / 16) | 0\n const view32 = new Uint32Array(key, 0, blocks * 4)\n\n for (let i = 0; i < blocks; i++) {\n const k = view32.subarray(i * 4, (i + 1) * 4)\n\n k[0] = Math.imul(k[0], C[0])\n k[0] = rotl(k[0], 15)\n k[0] = Math.imul(k[0], C[1])\n\n hash[0] = (hash[0] ^ k[0])\n hash[0] = rotl(hash[0], 19)\n hash[0] = (hash[0] + hash[1])\n hash[0] = Math.imul(hash[0], 5) + 0x561ccd1b\n\n k[1] = Math.imul(k[1], C[1])\n k[1] = rotl(k[1], 16)\n k[1] = Math.imul(k[1], C[2])\n\n hash[1] = (hash[1] ^ k[1])\n hash[1] = rotl(hash[1], 17)\n hash[1] = (hash[1] + hash[2])\n hash[1] = Math.imul(hash[1], 5) + 0x0bcaa747\n\n k[2] = Math.imul(k[2], C[2])\n k[2] = rotl(k[2], 17)\n k[2] = Math.imul(k[2], C[3])\n\n hash[2] = (hash[2] ^ k[2])\n hash[2] = rotl(hash[2], 15)\n hash[2] = (hash[2] + hash[3])\n hash[2] = Math.imul(hash[2], 5) + 0x96cd1c35\n\n k[3] = Math.imul(k[3], C[3])\n k[3] = rotl(k[3], 18)\n k[3] = Math.imul(k[3], C[0])\n\n hash[3] = (hash[3] ^ k[3])\n hash[3] = rotl(hash[3], 13)\n hash[3] = (hash[3] + hash[0])\n hash[3] = Math.imul(hash[3], 5) + 0x32ac3b17\n }\n}\n \nfunction tail (key : ArrayBuffer, hash : Uint32Array) {\n const blocks = (key.byteLength / 16) | 0\n const reminder = (key.byteLength % 16)\n \n const k = new Uint32Array(4)\n const tail = new Uint8Array(key, blocks * 16, reminder)\n \n switch (reminder) {\n case 15:\n k[3] = (k[3] ^ (tail[14] << 16))\n break// fallthrough\n case 14:\n k[3] = (k[3] ^ (tail[13] << 8))\n break// fallthrough\n case 13:\n k[3] = (k[3] ^ (tail[12] << 0))\n \n k[3] = Math.imul(k[3], C[3])\n k[3] = rotl(k[3], 18)\n k[3] = Math.imul(k[3], C[0])\n hash[3] = (hash[3] ^ k[3])\n break\n // fallthrough\n case 12:\n k[2] = (k[2] ^ (tail[11] << 24))\n break// fallthrough\n case 11:\n k[2] = (k[2] ^ (tail[10] << 16))\n break// fallthrough\n case 10:\n k[2] = (k[2] ^ (tail[9] << 8))\n break// fallthrough\n case 9:\n k[2] = (k[2] ^ (tail[8] << 0))\n \n k[2] = Math.imul(k[2], C[2])\n k[2] = rotl(k[2], 17)\n k[2] = Math.imul(k[2], C[3])\n hash[2] = (hash[2] ^ k[2])\n break\n // fallthrough\n case 8:\n k[1] = (k[1] ^ (tail[7] << 24))\n break// fallthrough\n case 7:\n k[1] = (k[1] ^ (tail[6] << 16))\n break// fallthrough\n case 6:\n k[1] = (k[1] ^ (tail[5] << 8))\n break// fallthrough\n case 5:\n k[1] = (k[1] ^ (tail[4] << 0))\n \n k[1] = Math.imul(k[1], C[1])\n k[1] = rotl(k[1], 16)\n k[1] = Math.imul(k[1], C[2])\n hash[1] = (hash[1] ^ k[1])\n break\n // fallthrough\n case 4:\n k[0] = (k[0] ^ (tail[3] << 24))\n break// fallthrough\n case 3:\n k[0] = (k[0] ^ (tail[2] << 16))\n break// fallthrough\n case 2:\n k[0] = (k[0] ^ (tail[1] << 8))\n break// fallthrough\n case 1:\n k[0] = (k[0] ^ (tail[0] << 0))\n \n k[0] = Math.imul(k[0], C[0])\n k[0] = rotl(k[0], 15)\n k[0] = Math.imul(k[0], C[1])\n hash[0] = (hash[0] ^ k[0])\n break\n }\n}\n \nfunction finalize (key : ArrayBuffer, hash : Uint32Array) {\n hash[0] = (hash[0] ^ key.byteLength)\n hash[1] = (hash[1] ^ key.byteLength)\n hash[2] = (hash[2] ^ key.byteLength)\n hash[3] = (hash[3] ^ key.byteLength)\n \n hash[0] = (hash[0] + hash[1]) | 0\n hash[0] = (hash[0] + hash[2]) | 0\n hash[0] = (hash[0] + hash[3]) | 0\n \n hash[1] = (hash[1] + hash[0]) | 0\n hash[2] = (hash[2] + hash[0]) | 0\n hash[3] = (hash[3] + hash[0]) | 0\n \n hash[0] = fmix(hash[0])\n hash[1] = fmix(hash[1])\n hash[2] = fmix(hash[2])\n hash[3] = fmix(hash[3])\n \n hash[0] = (hash[0] + hash[1]) | 0\n hash[0] = (hash[0] + hash[2]) | 0\n hash[0] = (hash[0] + hash[3]) | 0\n \n hash[1] = (hash[1] + hash[0]) | 0\n hash[2] = (hash[2] + hash[0]) | 0\n hash[3] = (hash[3] + hash[0]) | 0\n}\n \nexport function hash (key : ArrayBuffer | string, seed = 0) : string {\n seed = (seed ? (seed | 0) : 0)\n \n if (typeof key === 'string') {\n key = encodeUtf8(key)\n }\n \n if (!(key instanceof ArrayBuffer)) {\n throw new TypeError('Expected key to be ArrayBuffer or string')\n }\n \n const hash = new Uint32Array([seed, seed, seed, seed])\n \n body(key, hash)\n tail(key, hash)\n finalize(key, hash)\n const byteArray = new Uint8Array(hash.buffer);\n return Array.from(byteArray).map(byte => byte.toString(16).padStart(2, '0')).join('');\n}","import {\n FingerprintComponentValue,\n GingerJsFp,\n} from \"../../core\";\nimport {\n componentInterface,\n getComponentPromises,\n timeoutInstance,\n} from \"../factory\";\nimport { hash } from \"../utils/hash\";\nimport { raceAll } from \"../utils/raceAll\";\nimport { options } from \"./options\";\n\nexport async function getFingerprintData(): Promise<componentInterface> {\n try {\n const promiseMap: Record<\n string,\n Promise<componentInterface>\n > = getComponentPromises();\n\n const keys: string[] = Object.keys(promiseMap);\n const promises: Promise<componentInterface>[] = Object.values(promiseMap);\n const resolvedValues: (componentInterface | undefined)[] = await raceAll(\n promises,\n options?.timeout || 1000,\n timeoutInstance\n );\n\n const resolvedComponents: Record<string, componentInterface> = {};\n \n resolvedValues.forEach((value, index) => {\n if (value !== undefined) {\n resolvedComponents[keys[index]] = value;\n }\n });\n\n return filterFingerprintData(\n resolvedComponents,\n options.exclude || [],\n options.include || [],\n \"\"\n );\n } catch (error) {\n throw error;\n }\n}\n\n/**\n * This function filters the fingerprint data based on the exclude and include list\n * @param {componentInterface} obj - components objects from main componentInterface\n * @param {string[]} excludeList - elements to exclude from components objects (e.g : 'canvas', 'system.browser')\n * @param {string[]} includeList - elements to only include from components objects (e.g : 'canvas', 'system.browser')\n * @param {string} path - auto-increment path iterating on key objects from components objects\n * @returns {componentInterface} result - returns the final object before hashing in order to get fingerprint\n */\nexport function filterFingerprintData(\n obj: componentInterface,\n excludeList: string[],\n includeList: string[],\n path: string = \"\"\n): componentInterface {\n const result: componentInterface = {};\n for (const [key, value] of Object.entries(obj)) {\n const currentPath = path + key + \".\";\n\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const filtered = filterFingerprintData(\n value,\n excludeList,\n includeList,\n currentPath\n );\n if (Object.keys(filtered).length > 0) {\n result[key] = filtered;\n }\n } else {\n const isExcluded = excludeList.some((exclusion) =>\n currentPath.startsWith(exclusion)\n );\n const isIncluded = includeList.some((inclusion) =>\n currentPath.startsWith(inclusion)\n );\n\n if (!isExcluded || isIncluded) {\n result[key] = value;\n }\n }\n }\n\n return result;\n}\n\nexport async function getFingerprint(): Promise<GingerJsFp> {\n try {\n const fingerprintData = await getFingerprintData();\n\n const serializedFingerprint = getSerializedFingerprintObj(fingerprintData);\n const thisHash = hash(JSON.stringify(serializedFingerprint));\n const componentsUsedForHash = getHashRelevantKeys(serializedFingerprint as componentInterface);\n return {\n hash: thisHash.toString(),\n data: fingerprintData,\n componentsUsedForHash: componentsUsedForHash,\n };\n } catch (error) {\n throw error;\n }\n}\n\nfunction serializedObject(data: componentInterface): FingerprintComponentValue {\n return {\n audio: data.audio,\n fonts: data.fonts,\n hardware: data.hardware,\n math: data.math,\n permissions: data.permissions,\n screen: data.screen,\n system: data.system,\n emojiFingerprint: data.emojiFingerprint,\n vendorFlavour: data.vendorFlavour,\n colorGamut: data.colorGamut,\n canvas: data.canvas,\n webglBasics: data.webGlBasics,\n };\n}\n\nfunction getSerializedFingerprintObj(\n data: componentInterface\n): FingerprintComponentValue {\n return serializedObject(data);\n}\n\nfunction getHashRelevantKeys(\n data: componentInterface\n): Array<keyof FingerprintComponentValue> {\n const fpdata = serializedObject(data);\n return Object.keys(fpdata) as Array<keyof FingerprintComponentValue>;\n}\n","type DelayedPromise<T> = Promise<T>;\n\nexport function delay<T>(t: number, val: T): DelayedPromise<T> {\n return new Promise<T>((resolve) => {\n setTimeout(() => resolve(val), t);\n });\n}\n\n\nexport interface RaceResult<T> {\n value: T;\n elapsed?: number;\n}\n\nexport function raceAll<T>(promises: Promise<T>[], timeoutTime: number, timeoutVal: T): Promise<(T | undefined)[]> {\n return Promise.all(promises.map((p) => {\n return Promise.race([p, delay(timeoutTime, timeoutVal)]);\n }));\n}","import { TorDetectionResult } from \"../../core\";\n\nasync function detectTorBrowser(): Promise<TorDetectionResult> {\n const totalChecks = 7;\n let score = 0;\n\n const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;\n if (tz === \"Atlantic/Reykjavik\") score++;\n const webGLInfo = getWebGLInfo();\n if ([\"Mozilla\", \"unknown\"].includes(webGLInfo.vendor)) score++;\n if (!window.RTCPeerConnection) score++;\n if (!(navigator as any).deviceMemory) score++;\n if (navigator.hardwareConcurrency === 2) score++;\n if (!navigator.credentials) score++;\n if (!navigator.geolocation) score++;\n\n return {\n status: score >= 6,\n confidence: `${((score / totalChecks)).toFixed(2)}`,\n };\n}\n\nconst getWebGLInfo = (): { vendor: string; renderer: string } => {\n try {\n const canvas = document.createElement(\"canvas\");\n const gl: any =\n canvas.getContext(\"webgl\") || canvas.getContext(\"experimental-webgl\");\n if (!gl) return { vendor: \"unsupported\", renderer: \"unsupported\" };\n const debugInfo = gl.getExtension(\"WEBGL_debug_renderer_info\");\n return debugInfo\n ? {\n vendor: gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL),\n renderer: gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL),\n }\n : { vendor: \"unknown\", renderer: \"unknown\" };\n } catch {\n return { vendor: \"error\", renderer: \"error\" };\n }\n};\n\nexport { detectTorBrowser };\n","type IncognitoDetectionResult = {\n status: boolean;\n browser_name: string;\n};\n\nasync function detectIncognito(): Promise<IncognitoDetectionResult> {\n return new Promise(function (resolve, reject) {\n let browser_name = 'unknown';\n\n function __callback (status: boolean): void {\n resolve({\n status,\n browser_name\n })\n }\n \n function identifyChromium (): string {\n const ua = navigator.userAgent\n if (ua.match(/Chrome/)) {\n if ((navigator as any).brave !== undefined) {\n return 'Brave'\n } else if (ua.match(/Edg/)) {\n return 'Edge'\n } else if (ua.match(/OPR/)) {\n return 'Opera'\n }\n return 'Chrome'\n } else {\n return 'Chromium'\n }\n }\n \n function assertEvalToString (value: number): boolean {\n return value === eval.toString().length\n }\n \n function feid (): number {\n let toFixedEngineID = 0\n let neg = parseInt(\"-1\")\n try {\n neg.toFixed(neg)\n } catch (e) {\n toFixedEngineID = (e as Error).message.length \n }\n return toFixedEngineID\n }\n \n function isSafari (): boolean {\n return feid() === 44\n }\n \n function isChrome (): boolean {\n return feid() === 51\n }\n \n function isFirefox (): boolean {\n return feid() === 25\n }\n \n function isMSIE (): boolean {\n return (\n (navigator as any).msSaveBlob !== undefined && assertEvalToString(39)\n )\n }\n \n /**\n * Safari (Safari for iOS & macOS)\n **/\n \n function newSafariTestByStorageFallback (): void {\n if (!navigator.storage?.estimate) {\n __callback(false);\n return;\n }\n \n navigator.storage\n .estimate()\n .then(({ quota }) => {\n // iOS 18.x/macOS Safari 18.x (normal): ~41GB\n // iOS 18.x/macOS Safari 18.x (private): ~1GB\n // If reported quota < 2 GB => likely private\n if (quota && quota < 2_000_000_000) {\n __callback(true);\n } else {\n __callback(false);\n }\n })\n .catch(() => {\n __callback(false);\n });\n }\n \n function newSafariTest (): void {\n const tmp_name = String(Math.random())\n \n try {\n const db = window.indexedDB.open(tmp_name, 1)\n \n db.onupgradeneeded = function (i: any) {\n const res = i.target?.result\n \n try {\n res.createObjectStore('test', {\n autoIncrement: true\n }).put(new Blob())\n } catch (e) {\n let message = e\n \n if (e instanceof Error) {\n message = e.message ?? e\n }\n \n if (typeof message !== 'string') {\n __callback(false); return\n }\n \n const matchesExpectedError = message.includes('BlobURLs are not yet supported')\n if (matchesExpectedError) {\n __callback(true)\n }\n } finally {\n res.close()\n window.indexedDB.deleteDatabase(tmp_name)\n \n // indexdb works on newer versions of safari so we need to check via storage fallback\n newSafariTestByStorageFallback();\n }\n }\n } catch (e) {\n __callback(false)\n }\n }\n \n function oldSafariTest (): void {\n const openDB = (window as any).openDatabase\n const storage = window.localStorage\n try {\n openDB(null, null, null, null)\n } catch (e) {\n __callback(true); return\n }\n try {\n storage.setItem('test', '1')\n storage.removeItem('test')\n } catch (e) {\n __callback(true); return\n }\n __callback(false)\n }\n \n function safariPrivateTest (): void {\n if (navigator.maxTouchPoints !== undefined) {\n newSafariTest()\n } else {\n oldSafariTest()\n }\n }\n \n /**\n * Chrome\n **/\n \n function getQuotaLimit (): number {\n const w = window as any\n if (\n w.performance !== undefined &&\n w.performance.memory !== undefined &&\n w.performance.memory.jsHeapSizeLimit !== undefined\n ) {\n return (performance as any).memory.jsHeapSizeLimit\n }\n return 1073741824\n }\n \n // >= 76\n function storageQuotaChromePrivateTest (): void {\n (navigator as any).webkitTemporaryStorage.queryUsageAndQuota(\n function (_: number, quota: number) {\n const quotaInMib = Math.round(quota / (1024 * 1024))\n const quotaLimitInMib = Math.round(getQuotaLimit() / (1024 * 1024)) * 2\n \n __callback(quotaInMib < quotaLimitInMib)\n },\n function (e: any) {\n reject(\n new Error(\n 'detectIncognito somehow failed to query storage quota: ' +\n e.message\n )\n )\n }\n )\n }\n \n // 50 to 75\n function oldChromePrivateTest (): void {\n const fs = (window as any).webkitRequestFileSystem\n const success = function () {\n __callback(false)\n }\n const error = function () {\n __callback(true)\n }\n fs(0, 1, success, error)\n }\n \n function chromePrivateTest (): void {\n if (self.Promise !== undefined && (self.Promise as any).allSettled !== undefined) {\n storageQuotaChromePrivateTest()\n } else {\n oldChromePrivateTest()\n }\n }\n \n /**\n * Firefox\n **/\n \n function firefoxPrivateTest (): void {\n __callback(navigator.serviceWorker === undefined)\n }\n \n /**\n * MSIE\n **/\n \n function msiePrivateTest (): void {\n __callback(window.indexedDB === undefined)\n }\n \n function main (): void {\n if (isSafari()) {\n browser_name = 'Safari'\n safariPrivateTest()\n } else if (isChrome()) {\n browser_name = identifyChromium()\n chromePrivateTest()\n } else if (isFirefox()) {\n browser_name = 'Firefox'\n firefoxPrivateTest()\n } else if (isMSIE()) {\n browser_name = 'Internet Explorer'\n msiePrivateTest()\n } else {\n reject(new Error('detectIncognito cannot determine the browser'))\n }\n }\n \n main()\n })\n }\n\nexport {detectIncognito}","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","/**\n * Fingerprint BotD v1.9.1 - Copyright (c) FingerprintJS, Inc, 2024 (https://fingerprint.com)\n * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.\n */\n\nimport { __extends, __awaiter, __generator, __spreadArray } from 'tslib';\n\nvar version = \"1.9.1\";\n\n/**\n * Enum for types of bots.\n * Specific types of bots come first, followed by automation technologies.\n *\n * @readonly\n * @enum {string}\n */\nvar BotKind = {\n // Object is used instead of Typescript enum to avoid emitting IIFE which might be affected by further tree-shaking.\n // See example of compiled enums https://stackoverflow.com/q/47363996)\n Awesomium: 'awesomium',\n Cef: 'cef',\n CefSharp: 'cefsharp',\n CoachJS: 'coachjs',\n Electron: 'electron',\n FMiner: 'fminer',\n Geb: 'geb',\n NightmareJS: 'nightmarejs',\n Phantomas: 'phantomas',\n PhantomJS: 'phantomjs',\n Rhino: 'rhino',\n Selenium: 'selenium',\n Sequentum: 'sequentum',\n SlimerJS: 'slimerjs',\n WebDriverIO: 'webdriverio',\n WebDriver: 'webdriver',\n HeadlessChrome: 'headless_chrome',\n Unknown: 'unknown',\n};\n/**\n * Bot detection error.\n */\nvar BotdError = /** @class */ (function (_super) {\n __extends(BotdError, _super);\n /**\n * Creates a new BotdError.\n *\n * @class\n */\n function BotdError(state, message) {\n var _this = _super.call(this, message) || this;\n _this.state = state;\n _this.name = 'BotdError';\n Object.setPrototypeOf(_this, BotdError.prototype);\n return _this;\n }\n return BotdError;\n}(Error));\n\nfunction detect(components, detectors) {\n var detections = {};\n var finalDetection = {\n bot: false,\n };\n for (var detectorName in detectors) {\n var detector = detectors[detectorName];\n var detectorRes = detector(components);\n var detection = { bot: false };\n if (typeof detectorRes === 'string') {\n detection = { bot: true, botKind: detectorRes };\n }\n else if (detectorRes) {\n detection = { bot: true, botKind: BotKind.Unknown };\n }\n detections[detectorName] = detection;\n if (detection.bot) {\n finalDetection = detection;\n }\n }\n return [detections, finalDetection];\n}\nfunction collect(sources) {\n return __awaiter(this, void 0, void 0, function () {\n var components, sourcesKeys;\n var _this = this;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n components = {};\n sourcesKeys = Object.keys(sources);\n return [4 /*yield*/, Promise.all(sourcesKeys.map(function (sourceKey) { return __awaiter(_this, void 0, void 0, function () {\n var res, _a, _b, error_1;\n var _c;\n return __generator(this, function (_d) {\n switch (_d.label) {\n case 0:\n res = sources[sourceKey];\n _d.label = 1;\n case 1:\n _d.trys.push([1, 3, , 4]);\n _a = components;\n _b = sourceKey;\n _c = {};\n return [4 /*yield*/, res()];\n case 2:\n _a[_b] = (_c.value = _d.sent(),\n _c.state = 0 /* State.Success */,\n _c);\n return [3 /*break*/, 4];\n case 3:\n error_1 = _d.sent();\n if (error_1 instanceof BotdError) {\n components[sourceKey] = {\n state: error_1.state,\n error: \"\".concat(error_1.name, \": \").concat(error_1.message),\n };\n }\n else {\n components[sourceKey] = {\n state: -3 /* State.UnexpectedBehaviour */,\n error: error_1 instanceof Error ? \"\".concat(error_1.name, \": \").concat(error_1.message) : String(error_1),\n };\n }\n return [3 /*break*/, 4];\n case 4: return [2 /*return*/];\n }\n });\n }); }))];\n case 1:\n _a.sent();\n return [2 /*return*/, components];\n }\n });\n });\n}\n\nfunction detectAppVersion(_a) {\n var appVersion = _a.appVersion;\n if (appVersion.state !== 0 /* State.Success */)\n return false;\n if (/headless/i.test(appVersion.value))\n return BotKind.HeadlessChrome;\n if (/electron/i.test(appVersion.value))\n return BotKind.Electron;\n if (/slimerjs/i.test(appVersion.value))\n return BotKind.SlimerJS;\n}\n\nfunction arrayIncludes(arr, value) {\n return arr.indexOf(value) !== -1;\n}\nfunction strIncludes(str, value) {\n return str.indexOf(value) !== -1;\n}\nfunction arrayFind(array, callback) {\n if ('find' in array)\n return array.find(callback);\n for (var i = 0; i < array.length; i++) {\n if (callback(array[i], i, array))\n return array[i];\n }\n return undefined;\n}\n\nfunction getObjectProps(obj) {\n return Object.getOwnPropertyNames(obj);\n}\nfunction includes(arr) {\n var keys = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n keys[_i - 1] = arguments[_i];\n }\n var _loop_1 = function (key) {\n if (typeof key === 'string') {\n if (arrayIncludes(arr, key))\n return { value: true };\n }\n else {\n var match = arrayFind(arr, function (value) { return key.test(value); });\n if (match != null)\n return { value: true };\n }\n };\n for (var _a = 0, keys_1 = keys; _a < keys_1.length; _a++) {\n var key = keys_1[_a];\n var state_1 = _loop_1(key);\n if (typeof state_1 === \"object\")\n return state_1.value;\n }\n return false;\n}\nfunction countTruthy(values) {\n return values.reduce(function (sum, value) { return sum + (value ? 1 : 0); }, 0);\n}\n\nfunction detectDocumentAttributes(_a) {\n var documentElementKeys = _a.documentElementKeys;\n if (documentElementKeys.state !== 0 /* State.Success */)\n return false;\n if (includes(documentElementKeys.value, 'selenium', 'webdriver', 'driver')) {\n return BotKind.Selenium;\n }\n}\n\nfunction detectErrorTrace(_a) {\n var errorTrace = _a.errorTrace;\n if (errorTrace.state !== 0 /* State.Success */)\n return false;\n if (/PhantomJS/i.test(errorTrace.value))\n return BotKind.PhantomJS;\n}\n\nfunction detectEvalLengthInconsistency(_a) {\n var evalLength = _a.evalLength, browserKind = _a.browserKind, browserEngineKind = _a.browserEngineKind;\n if (evalLength.state !== 0 /* State.Success */ ||\n browserKind.state !== 0 /* State.Success */ ||\n browserEngineKind.state !== 0 /* State.Success */)\n return;\n var length = evalLength.value;\n if (browserEngineKind.value === \"unknown\" /* BrowserEngineKind.Unknown */)\n return false;\n return ((length === 37 && !arrayIncludes([\"webkit\" /* BrowserEngineKind.Webkit */, \"gecko\" /* BrowserEngineKind.Gecko */], browserEngineKind.value)) ||\n (length === 39 && !arrayIncludes([\"internet_explorer\" /* BrowserKind.IE */], browserKind.value)) ||\n (length === 33 && !arrayIncludes([\"chromium\" /* BrowserEngineKind.Chromium */], browserEngineKind.value)));\n}\n\nfunction detectFunctionBind(_a) {\n var functionBind = _a.functionBind;\n if (functionBind.state === -2 /* State.NotFunction */)\n return BotKind.PhantomJS;\n}\n\nfunction detectLanguagesLengthInconsistency(_a) {\n var languages = _a.languages;\n if (languages.state === 0 /* State.Success */ && languages.value.length === 0) {\n return BotKind.HeadlessChrome;\n }\n}\n\nfunction detectMimeTypesConsistent(_a) {\n var mimeTypesConsistent = _a.mimeTypesConsistent;\n if (mimeTypesConsistent.state === 0 /* State.Success */ && !mimeTypesConsistent.value) {\n return BotKind.Unknown;\n }\n}\n\nfunction detectNotificationPermissions(_a) {\n var notificationPermissions = _a.notificationPermissions, browserKind = _a.browserKind;\n if (browserKind.state !== 0 /* State.Success */ || browserKind.value !== \"chrome\" /* BrowserKind.Chrome */)\n return false;\n if (notificationPermissions.state === 0 /* State.Success */ && notificationPermissions.value) {\n return BotKind.HeadlessChrome;\n }\n}\n\nfunction detectPluginsArray(_a) {\n var pluginsArray = _a.pluginsArray;\n if (pluginsArray.state === 0 /* State.Success */ && !pluginsArray.value)\n return BotKind.HeadlessChrome;\n}\n\nfunction detectPluginsLengthInconsistency(_a) {\n var pluginsLength = _a.pluginsLength, android = _a.android, browserKind = _a.browserKind, browserEngineKind = _a.browserEngineKind;\n if (pluginsLength.state !== 0 /* State.Success */ ||\n android.state !== 0 /* State.Success */ ||\n browserKind.state !== 0 /* State.Success */ ||\n browserEngineKind.state !== 0 /* State.Success */)\n return;\n if (browserKind.value !== \"chrome\" /* BrowserKind.Chrome */ ||\n android.value ||\n browserEngineKind.value !== \"chromium\" /* BrowserEngineKind.Chromium */)\n return;\n if (pluginsLength.value === 0)\n return BotKind.HeadlessChrome;\n}\n\nfunction detectProcess(_a) {\n var _b;\n var process = _a.process;\n if (process.state !== 0 /* State.Success */)\n return false;\n if (process.value.type === 'renderer' || ((_b = process.value.versions) === null || _b === void 0 ? void 0 : _b.electron) != null)\n return BotKind.Electron;\n}\n\nfunction detectProductSub(_a) {\n var productSub = _a.productSub, browserKind = _a.browserKind;\n if (productSub.state !== 0 /* State.Success */ || browserKind.state !== 0 /* State.Success */)\n return false;\n if ((browserKind.value === \"chrome\" /* BrowserKind.Chrome */ ||\n browserKind.value === \"safari\" /* BrowserKind.Safari */ ||\n browserKind.value === \"opera\" /* BrowserKind.Opera */ ||\n browserKind.value === \"wechat\" /* BrowserKind.WeChat */) &&\n productSub.value !== '20030107')\n return BotKind.Unknown;\n}\n\nfunction detectUserAgent(_a) {\n var userAgent = _a.userAgent;\n if (userAgent.state !== 0 /* State.Success */)\n return false;\n if (/PhantomJS/i.test(userAgent.value))\n return BotKind.PhantomJS;\n if (/Headless/i.test(userAgent.value))\n return BotKind.HeadlessChrome;\n if (/Electron/i.test(userAgent.value))\n return BotKind.Electron;\n if (/slimerjs/i.test(userAgent.value))\n return BotKind.SlimerJS;\n}\n\nfunction detectWebDriver(_a) {\n var webDriver = _a.webDriver;\n if (webDriver.state === 0 /* State.Success */ && webDriver.value)\n return BotKind.HeadlessChrome;\n}\n\nfunction detectWebGL(_a) {\n var webGL = _a.webGL;\n if (webGL.state === 0 /* State.Success */) {\n var _b = webGL.value, vendor = _b.vendor, renderer = _b.renderer;\n if (vendor == 'Brian Paul' && renderer == 'Mesa OffScreen') {\n return BotKind.HeadlessChrome;\n }\n }\n}\n\nfunction detectWindowExternal(_a) {\n var windowExternal = _a.windowExternal;\n if (windowExternal.state !== 0 /* State.Success */)\n return false;\n if (/Sequentum/i.test(windowExternal.value))\n return BotKind.Sequentum;\n}\n\nfunction detectWindowSize(_a) {\n var windowSize = _a.windowSize, documentFocus = _a.documentFocus;\n if (windowSize.state !== 0 /* State.Success */ || documentFocus.state !== 0 /* State.Success */)\n return false;\n var _b = windowSize.value, outerWidth = _b.outerWidth, outerHeight = _b.outerHeight;\n // When a page is opened in a new tab without focusing it right away, the window outer size is 0x0\n if (!documentFocus.value)\n return;\n if (outerWidth === 0 && outerHeight === 0)\n return BotKind.HeadlessChrome;\n}\n\nfunction detectDistinctiveProperties(_a) {\n var distinctiveProps = _a.distinctiveProps;\n if (distinctiveProps.state !== 0 /* State.Success */)\n return false;\n var value = distinctiveProps.value;\n var bot;\n for (bot in value)\n if (value[bot])\n return bot;\n}\n\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nvar detectors = {\n detectAppVersion: detectAppVersion,\n detectDocumentAttributes: detectDocumentAttributes,\n detectErrorTrace: detectErrorTrace,\n detectEvalLengthInconsistency: detectEvalLengthInconsistency,\n detectFunctionBind: detectFunctionBind,\n detectLanguagesLengthInconsistency: detectLanguagesLengthInconsistency,\n detectNotificationPermissions: detectNotificationPermissions,\n detectPluginsArray: detectPluginsArray,\n detectPluginsLengthInconsistency: detectPluginsLengthInconsistency,\n detectProcess: detectProcess,\n detectUserAgent: detectUserAgent,\n detectWebDriver: detectWebDriver,\n detectWebGL: detectWebGL,\n detectWindowExternal: detectWindowExternal,\n detectWindowSize: detectWindowSize,\n detectMimeTypesConsistent: detectMimeTypesConsistent,\n detectProductSub: detectProductSub,\n detectDistinctiveProperties: detectDistinctiveProperties,\n};\n\nfunction getAppVersion() {\n var appVersion = navigator.appVersion;\n if (appVersion == undefined) {\n throw new BotdError(-1 /* State.Undefined */, 'navigator.appVersion is undefined');\n }\n return appVersion;\n}\n\nfunction getDocumentElementKeys() {\n if (document.documentElement === undefined) {\n throw new BotdError(-1 /* State.Undefined */, 'document.documentElement is undefined');\n }\n var documentElement = document.documentElement;\n if (typeof documentElement.getAttributeNames !== 'function') {\n throw new BotdError(-2 /* State.NotFunction */, 'document.documentElement.getAttributeNames is not a function');\n }\n return documentElement.getAttributeNames();\n}\n\nfunction getErrorTrace() {\n try {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n null[0]();\n }\n catch (error) {\n if (error instanceof Error && error['stack'] != null) {\n return error.stack.toString();\n }\n }\n throw new BotdError(-3 /* State.UnexpectedBehaviour */, 'errorTrace signal unexpected behaviour');\n}\n\nfunction getEvalLength() {\n return eval.toString().length;\n}\n\nfunction getFunctionBind() {\n if (Function.prototype.bind === undefined) {\n throw new BotdError(-2 /* State.NotFunction */, 'Function.prototype.bind is undefined');\n }\n return Function.prototype.bind.toString();\n}\n\nfunction getBrowserEngineKind() {\n var _a, _b;\n // Based on research in October 2020. Tested to detect Chromium 42-86.\n var w = window;\n var n = navigator;\n if (countTruthy([\n 'webkitPersistentStorage' in n,\n 'webkitTemporaryStorage' in n,\n n.vendor.indexOf('Google') === 0,\n 'webkitResolveLocalFileSystemURL' in w,\n 'BatteryManager' in w,\n 'webkitMediaStream' in w,\n 'webkitSpeechGrammar' in w,\n ]) >= 5) {\n return \"chromium\" /* BrowserEngineKind.Chromium */;\n }\n if (countTruthy([\n 'ApplePayError' in w,\n 'CSSPrimitiveValue' in w,\n 'Counter' in w,\n n.vendor.indexOf('Apple') === 0,\n 'getStorageUpdates' in n,\n 'WebKitMediaKeys' in w,\n ]) >= 4) {\n return \"webkit\" /* BrowserEngineKind.Webkit */;\n }\n if (countTruthy([\n 'buildID' in navigator,\n 'MozAppearance' in ((_b = (_a = document.documentElement) === null || _a === void 0 ? void 0 : _a.style) !== null && _b !== void 0 ? _b : {}),\n 'onmozfullscreenchange' in w,\n 'mozInnerScreenX' in w,\n 'CSSMozDocumentRule' in w,\n 'CanvasCaptureMediaStream' in w,\n ]) >= 4) {\n return \"gecko\" /* BrowserEngineKind.Gecko */;\n }\n return \"unknown\" /* BrowserEngineKind.Unknown */;\n}\nfunction getBrowserKind() {\n var _a;\n var userAgent = (_a = navigator.userAgent) === null || _a === void 0 ? void 0 : _a.toLowerCase();\n if (strIncludes(userAgent, 'edg/')) {\n return \"edge\" /* BrowserKind.Edge */;\n }\n else if (strIncludes(userAgent, 'trident') || strIncludes(userAgent, 'msie')) {\n return \"internet_explorer\" /* BrowserKind.IE */;\n }\n else if (strIncludes(userAgent, 'wechat')) {\n return \"wechat\" /* BrowserKind.WeChat */;\n }\n else if (strIncludes(userAgent, 'firefox')) {\n return \"firefox\" /* BrowserKind.Firefox */;\n }\n else if (strIncludes(userAgent, 'opera') || strIncludes(userAgent, 'opr')) {\n return \"opera\" /* BrowserKind.Opera */;\n }\n else if (strIncludes(userAgent, 'chrome')) {\n return \"chrome\" /* BrowserKind.Chrome */;\n }\n else if (strIncludes(userAgent, 'safari')) {\n return \"safari\" /* BrowserKind.Safari */;\n }\n else {\n return \"unknown\" /* BrowserKind.Unknown */;\n }\n}\n// Source: https://github.com/fingerprintjs/fingerprintjs/blob/master/src/utils/browser.ts#L223\nfunction isAndroid() {\n var browserEngineKind = getBrowserEngineKind();\n var isItChromium = browserEngineKind === \"chromium\" /* BrowserEngineKind.Chromium */;\n var isItGecko = browserEngineKind === \"gecko\" /* BrowserEngineKind.Gecko */;\n // Only 2 browser engines are presented on Android.\n // Actually, there is also Android 4.1 browser, but it's not worth detecting it at the moment.\n if (!isItChromium && !isItGecko)\n return false;\n var w = window;\n // Chrome removes all words \"Android\" from `navigator` when desktop version is requested\n // Firefox keeps \"Android\" in `navigator.appVersion` when desktop version is requested\n return (countTruthy([\n 'onorientationchange' in w,\n 'orientation' in w,\n isItChromium && !('SharedWorker' in w),\n isItGecko && /android/i.test(navigator.appVersion),\n ]) >= 2);\n}\nfunction getDocumentFocus() {\n if (document.hasFocus === undefined) {\n return false;\n }\n return document.hasFocus();\n}\nfunction isChromium86OrNewer() {\n // Checked in Chrome 85 vs Chrome 86 both on desktop and Android\n var w = window;\n return (countTruthy([\n !('MediaSettingsRange' in w),\n 'RTCEncodedAudioFrame' in w,\n '' + w.Intl === '[object Intl]',\n '' + w.Reflect === '[object Reflect]',\n ]) >= 3);\n}\n\nfunction getLanguages() {\n var n = navigator;\n var result = [];\n var language = n.language || n.userLanguage || n.browserLanguage || n.systemLanguage;\n if (language !== undefined) {\n result.push([language]);\n }\n if (Array.isArray(n.languages)) {\n var browserEngine = getBrowserEngineKind();\n // Starting from Chromium 86, there is only a single value in `navigator.language` in Incognito mode:\n // the value of `navigator.language`. Therefore, the value is ignored in this browser.\n if (!(browserEngine === \"chromium\" /* BrowserEngineKind.Chromium */ && isChromium86OrNewer())) {\n result.push(n.languages);\n }\n }\n else if (typeof n.languages === 'string') {\n var languages = n.languages;\n if (languages) {\n result.push(languages.split(','));\n }\n }\n return result;\n}\n\nfunction areMimeTypesConsistent() {\n if (navigator.mimeTypes === undefined) {\n throw new BotdError(-1 /* State.Undefined */, 'navigator.mimeTypes is undefined');\n }\n var mimeTypes = navigator.mimeTypes;\n var isConsistent = Object.getPrototypeOf(mimeTypes) === MimeTypeArray.prototype;\n for (var i = 0; i < mimeTypes.length; i++) {\n isConsistent && (isConsistent = Object.getPrototypeOf(mimeTypes[i]) === MimeType.prototype);\n }\n return isConsistent;\n}\n\nfunction getNotificationPermissions() {\n return __awaiter(this, void 0, void 0, function () {\n var permissions, permissionStatus;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n if (window.Notification === undefined) {\n throw new BotdError(-1 /* State.Undefined */, 'window.Notification is undefined');\n }\n if (navigator.permissions === undefined) {\n throw new BotdError(-1 /* State.Undefined */, 'navigator.permissions is undefined');\n }\n permissions = navigator.permissions;\n if (typeof permissions.query !== 'function') {\n throw new BotdError(-2 /* State.NotFunction */, 'navigator.permissions.query is not a function');\n }\n _a.label = 1;\n case 1:\n _a.trys.push([1, 3, , 4]);\n return [4 /*yield*/, permissions.query({ name: 'notifications' })];\n case 2:\n permissionStatus = _a.sent();\n return [2 /*return*/, window.Notification.permission === 'denied' && permissionStatus.state === 'prompt'];\n case 3:\n _a.sent();\n throw new BotdError(-3 /* State.UnexpectedBehaviour */, 'notificationPermissions signal unexpected behaviour');\n case 4: return [2 /*return*/];\n }\n });\n });\n}\n\nfunction getPluginsArray() {\n if (navigator.plugins === undefined) {\n throw new BotdError(-1 /* State.Undefined */, 'navigator.plugins is undefined');\n }\n if (window.PluginArray === undefined) {\n throw new BotdError(-1 /* State.Undefined */, 'window.PluginArray is undefined');\n }\n return navigator.plugins instanceof PluginArray;\n}\n\nfunction getPluginsLength() {\n if (navigator.plugins === undefined) {\n throw new BotdError(-1 /* State.Undefined */, 'navigator.plugins is undefined');\n }\n if (navigator.plugins.length === undefined) {\n throw new BotdError(-3 /* State.UnexpectedBehaviour */, 'navigator.plugins.length is undefined');\n }\n return navigator.plugins.length;\n}\n\nfunction getProcess() {\n var process = window.process;\n var errorPrefix = 'window.process is';\n if (process === undefined) {\n throw new BotdError(-1 /* State.Undefined */, \"\".concat(errorPrefix, \" undefined\"));\n }\n if (process && typeof process !== 'object') {\n throw new BotdError(-3 /* State.UnexpectedBehaviour */, \"\".concat(errorPrefix, \" not an object\"));\n }\n return process;\n}\n\nfunction getProductSub() {\n var productSub = navigator.productSub;\n if (productSub === undefined) {\n throw new BotdError(-1 /* State.Undefined */, 'navigator.productSub is undefined');\n }\n return productSub;\n}\n\nfunction getRTT() {\n if (navigator.connection === undefined) {\n throw new BotdError(-1 /* State.Undefined */, 'navigator.connection is undefined');\n }\n if (navigator.connection.rtt === undefined) {\n throw new BotdError(-1 /* State.Undefined */, 'navigator.connection.rtt is undefined');\n }\n return navigator.connection.rtt;\n}\n\nfunction getUserAgent() {\n return navigator.userAgent;\n}\n\nfunction getWebDriver() {\n if (navigator.webdriver == undefined) {\n throw new BotdError(-1 /* State.Undefined */, 'navigator.webdriver is undefined');\n }\n return navigator.webdriver;\n}\n\nfunction getWebGL() {\n var canvasElement = document.createElement('canvas');\n if (typeof canvasElement.getContext !== 'function') {\n throw new BotdError(-2 /* State.NotFunction */, 'HTMLCanvasElement.getContext is not a function');\n }\n var webGLContext = canvasElement.getContext('webgl');\n if (webGLContext === null) {\n throw new BotdError(-4 /* State.Null */, 'WebGLRenderingContext is null');\n }\n if (typeof webGLContext.getParameter !== 'function') {\n throw new BotdError(-2 /* State.NotFunction */, 'WebGLRenderingContext.getParameter is not a function');\n }\n var vendor = webGLContext.getParameter(webGLContext.VENDOR);\n var renderer = webGLContext.getParameter(webGLContext.RENDERER);\n return { vendor: vendor, renderer: renderer };\n}\n\nfunction getWindowExternal() {\n if (window.external === undefined) {\n throw new BotdError(-1 /* State.Undefined */, 'window.external is undefined');\n }\n var external = window.external;\n if (typeof external.toString !== 'function') {\n throw new BotdError(-2 /* State.NotFunction */, 'window.external.toString is not a function');\n }\n return external.toString();\n}\n\nfunction getWindowSize() {\n return {\n outerWidth: window.outerWidth,\n outerHeight: window.outerHeight,\n innerWidth: window.innerWidth,\n innerHeight: window.innerHeight,\n };\n}\n\nfunction checkDistinctiveProperties() {\n var _a;\n // The order in the following list matters, because specific types of bots come first, followed by automation technologies.\n var distinctivePropsList = (_a = {},\n _a[BotKind.Awesomium] = {\n window: ['awesomium'],\n },\n _a[BotKind.Cef] = {\n window: ['RunPerfTest'],\n },\n _a[BotKind.CefSharp] = {\n window: ['CefSharp'],\n },\n _a[BotKind.CoachJS] = {\n window: ['emit'],\n },\n _a[BotKind.FMiner] = {\n window: ['fmget_targets'],\n },\n _a[BotKind.Geb] = {\n window: ['geb'],\n },\n _a[BotKind.NightmareJS] = {\n window: ['__nightmare', 'nightmare'],\n },\n _a[BotKind.Phantomas] = {\n window: ['__phantomas'],\n },\n _a[BotKind.PhantomJS] = {\n window: ['callPhantom', '_phantom'],\n },\n _a[BotKind.Rhino] = {\n window: ['spawn'],\n },\n _a[BotKind.Selenium] = {\n window: ['_Selenium_IDE_Recorder', '_selenium', 'calledSelenium', /^([a-z]){3}_.*_(Array|Promise|Symbol)$/],\n document: ['__selenium_evaluate', 'selenium-evaluate', '__selenium_unwrapped'],\n },\n _a[BotKind.WebDriverIO] = {\n window: ['wdioElectron'],\n },\n _a[BotKind.WebDriver] = {\n window: [\n 'webdriver',\n '__webdriverFunc',\n '__lastWatirAlert',\n '__lastWatirConfirm',\n '__lastWatirPrompt',\n '_WEBDRIVER_ELEM_CACHE',\n 'ChromeDriverw',\n ],\n document: [\n '__webdriver_script_fn',\n '__driver_evaluate',\n '__webdriver_evaluate',\n '__fxdriver_evaluate',\n '__driver_unwrapped',\n '__webdriver_unwrapped',\n '__fxdriver_unwrapped',\n '__webdriver_script_fn',\n '__webdriver_script_func',\n '__webdriver_script_function',\n '$cdc_asdjflasutopfhvcZLmcf',\n '$cdc_asdjflasutopfhvcZLmcfl_',\n '$chrome_asyncScriptInfo',\n '__$webdriverAsyncExecutor',\n ],\n },\n _a[BotKind.HeadlessChrome] = {\n window: ['domAutomation', 'domAutomationController'],\n },\n _a);\n var botName;\n var result = {};\n var windowProps = getObjectProps(window);\n var documentProps = [];\n if (window.document !== undefined)\n documentProps = getObjectProps(window.document);\n for (botName in distinctivePropsList) {\n var props = distinctivePropsList[botName];\n if (props !== undefined) {\n var windowContains = props.window === undefined ? false : includes.apply(void 0, __spreadArray([windowProps], props.window, false));\n var documentContains = props.document === undefined || !documentProps.length ? false : includes.apply(void 0, __spreadArray([documentProps], props.document, false));\n result[botName] = windowContains || documentContains;\n }\n }\n return result;\n}\n\nvar sources = {\n android: isAndroid,\n browserKind: getBrowserKind,\n browserEngineKind: getBrowserEngineKind,\n documentFocus: getDocumentFocus,\n userAgent: getUserAgent,\n appVersion: getAppVersion,\n rtt: getRTT,\n windowSize: getWindowSize,\n pluginsLength: getPluginsLength,\n pluginsArray: getPluginsArray,\n errorTrace: getErrorTrace,\n productSub: getProductSub,\n windowExternal: getWindowExternal,\n mimeTypesConsistent: areMimeTypesConsistent,\n evalLength: getEvalLength,\n webGL: getWebGL,\n webDriver: getWebDriver,\n languages: getLanguages,\n notificationPermissions: getNotificationPermissions,\n documentElementKeys: getDocumentElementKeys,\n functionBind: getFunctionBind,\n process: getProcess,\n distinctiveProps: checkDistinctiveProperties,\n};\n\n/**\n * Class representing a bot detector.\n *\n * @class\n * @implements {BotDetectorInterface}\n */\nvar BotDetector = /** @class */ (function () {\n function BotDetector() {\n this.components = undefined;\n this.detections = undefined;\n }\n BotDetector.prototype.getComponents = function () {\n return this.components;\n };\n BotDetector.prototype.getDetections = function () {\n return this.detections;\n };\n /**\n * @inheritdoc\n */\n BotDetector.prototype.detect = function () {\n if (this.components === undefined) {\n throw new Error(\"BotDetector.detect can't be called before BotDetector.collect\");\n }\n var _a = detect(this.components, detectors), detections = _a[0], finalDetection = _a[1];\n this.detections = detections;\n return finalDetection;\n };\n /**\n * @inheritdoc\n */\n BotDetector.prototype.collect = function () {\n return __awaiter(this, void 0, void 0, function () {\n var _a;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n _a = this;\n return [4 /*yield*/, collect(sources)];\n case 1:\n _a.components = _b.sent();\n return [2 /*return*/, this.components];\n }\n });\n });\n };\n return BotDetector;\n}());\n\n/**\n * Sends an unpersonalized AJAX request to collect installation statistics\n */\nfunction monitor() {\n // The FingerprintJS CDN (https://github.com/fingerprintjs/cdn) replaces `window.__fpjs_d_m` with `true`\n if (window.__fpjs_d_m || Math.random() >= 0.001) {\n return;\n }\n try {\n var request = new XMLHttpRequest();\n request.open('get', \"https://m1.openfpcdn.io/botd/v\".concat(version, \"/npm-monitoring\"), true);\n request.send();\n }\n catch (error) {\n // console.error is ok here because it's an unexpected error handler\n // eslint-disable-next-line no-console\n console.error(error);\n }\n}\nfunction load(_a) {\n var _b = _a === void 0 ? {} : _a, _c = _b.monitoring, monitoring = _c === void 0 ? true : _c;\n return __awaiter(this, void 0, void 0, function () {\n var detector;\n return __generator(this, function (_d) {\n switch (_d.label) {\n case 0:\n if (monitoring) {\n monitor();\n }\n detector = new BotDetector();\n return [4 /*yield*/, detector.collect()];\n case 1:\n _d.sent();\n return [2 /*return*/, detector];\n }\n });\n });\n}\nvar index = { load: load };\n\nexport { BotKind, BotdError, collect, index as default, detect, detectors, load, sources };\n","import { load } from \"@fingerprintjs/botd\";\n\nasync function botDetection() {\n try {\n const botd = await load();\n const result = botd.detect();\n\n\n if (result.bot) {\n return {\n status: true,\n botKind: result.botKind,\n };\n } else {\n return {\n status: false,\n };\n }\n } catch (error) {\n console.error(error);\n return null;\n }\n}\n\nexport { botDetection };\n","// Enhanced browser detection with multiple techniques\ntype BrowserDetails = {\n name: string;\n version: string;\n confidence: number; // 0-100 score of detection confidence\n engine: string;\n};\n\n/**\n * Detect browser using multiple techniques to be resilient against spoofing and user agent changes\n */\nexport function getBrowserName(): string {\n const details = detectBrowser();\n return details.name;\n}\n\n/**\n * Enhanced browser detection that uses multiple techniques to identify the browser\n * with high confidence even when user agent is spoofed or in mobile simulation mode\n */\nexport function detectBrowser(): BrowserDetails {\n // Default result with low confidence\n const result: BrowserDetails = {\n name: \"Unknown\",\n version: \"Unknown\",\n confidence: 0,\n engine: \"Unknown\",\n };\n\n // Collection of detection results with confidence scores\n const detections: { name: string; confidence: number }[] = [];\n\n // First check for Edge in user agent (this is a fast check before other more intensive checks)\n const ua = navigator.userAgent.toLowerCase();\n if (ua.indexOf(\"edg/\") !== -1 || ua.indexOf(\"edge/\") !== -1) {\n detections.push({ name: \"Edge\", confidence: 75 });\n }\n\n // 1. Engine detection based on error messages (more reliable than UA)\n const engineSignatures = getEngineSignatures();\n detectByEngineSignatures(detections, engineSignatures);\n\n // 2. Feature detection for specific browsers\n detectByFeatures(detections);\n\n // 3. Protocol handler detection\n detectByProtocolHandlers(detections);\n\n // 4. CSS property detection\n detectByCssProperties(detections);\n\n // 5. Performance timing\n detectByPerformance(detections);\n\n // 6. JavaScript behavior patterns\n detectByJsBehavior(detections);\n\n // 7. Edge-specific detection - separate function to better differentiate Edge from Chrome\n detectEdgeBrowser(detections);\n\n // 8. Chrome-specific detection - enhanced Chrome detection\n detectChromeBrowser(detections);\n\n // 9. Brave-specific detection - get specific Brave signals\n detectBraveBrowser(detections);\n\n // Combine all detection results and calculate final browser with confidence\n if (detections.length > 0) {\n // Group by browser name and sum confidence\n const grouped = detections.reduce((acc, curr) => {\n acc[curr.name] = (acc[curr.name] || 0) + curr.confidence;\n return acc;\n }, {} as Record<string, number>);\n\n // Find the browser with highest confidence\n let maxConfidence = 0;\n let detectedBrowser = \"Unknown\";\n\n for (const [browser, confidence] of Object.entries(grouped)) {\n if (confidence > maxConfidence) {\n maxConfidence = confidence;\n detectedBrowser = browser;\n }\n }\n\n // Extra Edge check - check if incognito detection can confirm this is Edge\n if (detectedBrowser === \"Chrome\" && isActuallyEdge()) {\n detectedBrowser = \"Edge\";\n }\n\n result.name = detectedBrowser;\n result.confidence = Math.min(100, maxConfidence);\n\n // Set engine based on browser\n if ([\"Chrome\", \"Edge\", \"Opera\", \"Brave\"].includes(detectedBrowser)) {\n result.engine = \"Blink\";\n } else if (detectedBrowser === \"Firefox\") {\n result.engine = \"Gecko\";\n } else if (detectedBrowser === \"Safari\") {\n result.engine = \"WebKit\";\n }\n\n // Try to extract version\n result.version = getBrowserVersion(detectedBrowser);\n }\n\n return result;\n}\n\n/**\n * Special detection for Brave browser\n */\nfunction detectBraveBrowser(\n detections: { name: string; confidence: number }[]\n): void {\n try {\n // Check for Brave API directly\n if ((navigator as any).brave) {\n detections.push({ name: \"Brave\", confidence: 95 });\n return;\n }\n\n // Check for specific Brave patterns in the user agent\n const ua = navigator.userAgent;\n if (ua.includes(\"Brave\") || ua.includes(\"brave\")) {\n detections.push({ name: \"Brave\", confidence: 90 });\n return;\n }\n\n // Brave specific behavior checks\n // 1. Brave removes certain tracking headers\n // 2. Brave blocks fingerprinting by default\n // 3. Brave has specific privacy features\n\n // Check for Chrome without Google Chrome-specific features\n if (\n typeof (window as any).chrome !== \"undefined\" &&\n (window as any).chrome.runtime &&\n !(window as any).google\n ) {\n // Additional check for absence of Chrome-specific features\n const hasNoChromeFeatures =\n !(\"google\" in window) &&\n !(window as any).chrome.webstore &&\n typeof (navigator as any).brave !== \"undefined\";\n\n if (hasNoChromeFeatures) {\n detections.push({ name: \"Brave\", confidence: 60 });\n }\n }\n } catch (e) {\n // Ignore detection errors\n }\n}\n\n/**\n * Specific check to determine if a browser is Edge by using the same techniques\n * that incognito detection uses, which seems to report Edge correctly\n */\nfunction isActuallyEdge(): boolean {\n try {\n // Check user agent for Edge keywords\n const ua = navigator.userAgent.toLowerCase();\n if (ua.indexOf(\"edg/\") !== -1 || ua.indexOf(\"edge/\") !== -1) {\n return true;\n }\n\n // Check if any MS-specific APIs or DOM elements are available\n if (\n (window as any).msCredentials ||\n (document as any).documentMode ||\n typeof (window as any).MSInputMethodContext !== \"undefined\" ||\n typeof (navigator as any).msLaunchUri === \"function\"\n ) {\n return true;\n }\n\n // Check Edge-specific combination of features\n if (\n typeof (window as any).chrome !== \"undefined\" &&\n (window as any).chrome.runtime &&\n !(window as any).chrome.webstore &&\n !(window as any).opr &&\n !(window as any).opera\n ) {\n // Additional Edge-specific check\n try {\n // Edge typically does not have the Chrome PDF viewer plugin\n const hasChromePdfViewer = Array.from(navigator.plugins).some(\n (plugin) => plugin.name === \"Chrome PDF Viewer\"\n );\n\n // Check for unique Edge plugin patterns\n const hasEdgePluginPattern = Array.from(navigator.plugins).some(\n (plugin) => plugin.name.indexOf(\"Edge\") !== -1\n );\n\n if (!hasChromePdfViewer || hasEdgePluginPattern) {\n return true;\n }\n } catch (e) {\n // Plugin check failed\n }\n }\n\n return false;\n } catch (e) {\n return false;\n }\n}\n\n/**\n * Gets browser error behavior signature from various engine-specific behaviors\n */\nfunction getEngineSignatures(): {\n toFixedErrorLength: number;\n functionToStringLength: number;\n} {\n // Error message length from toFixed with negative values\n let toFixedErrorLength = 0;\n try {\n const neg = parseInt(\"-1\");\n neg.toFixed(neg);\n } catch (e: any) {\n toFixedErrorLength = e.message.length;\n }\n\n // Function.toString() behavior - varies by browser\n let functionToStringLength = 0;\n try {\n functionToStringLength = Function.prototype.toString.call(Function).length;\n } catch (e) {\n // Ignore error\n }\n\n return {\n toFixedErrorLength,\n functionToStringLength,\n };\n}\n\n/**\n * Detects browsers based on engine-specific error message patterns\n */\nfunction detectByEngineSignatures(\n detections: { name: string; confidence: number }[],\n signatures: { toFixedErrorLength: number; functionToStringLength: number }\n): void {\n // Safari typically has error message length of 44\n if (signatures.toFixedErrorLength === 44) {\n detections.push({ name: \"Safari\", confidence: 40 });\n }\n\n // Chrome typically has error message length of 51\n else if (signatures.toFixedErrorLength === 51) {\n detections.push({ name: \"Chrome\", confidence: 30 }); // Increased from 15\n }\n\n // Firefox typically has error message length of 25\n else if (signatures.toFixedErrorLength === 25) {\n detections.push({ name: \"Firefox\", confidence: 30 });\n }\n\n // Function.toString length can help differentiate browsers too\n if (\n signatures.functionToStringLength > 30 &&\n signatures.functionToStringLength < 40\n ) {\n detections.push({ name: \"Firefox\", confidence: 10 });\n } else if (signatures.functionToStringLength > 40) {\n detections.push({ name: \"Chrome\", confidence: 15 }); // Increased from 5\n }\n}\n\n/**\n * Detects browser by checking for browser-specific features and APIs\n */\nfunction detectByFeatures(\n detections: { name: string; confidence: number }[]\n): void {\n // Brave detection\n if (\n (navigator as any).brave &&\n typeof (navigator as any).brave.isBrave === \"function\"\n ) {\n detections.push({ name: \"Brave\", confidence: 90 });\n }\n\n // Check for Chrome-specific APIs\n if (\n typeof (window as any).chrome !== \"undefined\" &&\n (window as any).chrome.app &&\n (window as any).chrome.runtime\n ) {\n // First check if it's not actually Edge\n const ua = navigator.userAgent.toLowerCase();\n if (ua.indexOf(\"edg/\") === -1 && ua.indexOf(\"edge/\") === -1) {\n if ((navigator as any).brave === undefined) {\n detections.push({ name: \"Chrome\", confidence: 40 }); // Increased from 25\n }\n } else {\n // This is more likely Edge than Chrome\n detections.push({ name: \"Edge\", confidence: 40 });\n }\n }\n\n // Additional Chrome-specific feature detection\n if (\n (window as any).chrome &&\n (window as any).chrome.csi &&\n (window as any).chrome.loadTimes &&\n !(window as any).opr &&\n !(window as any).opera &&\n !(\n (navigator as any).brave &&\n typeof (navigator as any).brave.isBrave === \"function\"\n )\n ) {\n // These features are very specific to Chrome and not present in most other Chromium browsers\n detections.push({ name: \"Chrome\", confidence: 60 });\n }\n\n // Firefox-specific objects\n if (\n typeof (window as any).InstallTrigger !== \"undefined\" ||\n typeof (window as any).sidebar !== \"undefined\"\n ) {\n detections.push({ name: \"Firefox\", confidence: 70 });\n }\n\n // Safari detection\n if (\n /constructor/i.test((window as any).HTMLElement as any) ||\n (function (p) {\n return p.toString() === \"[object SafariRemoteNotification]\";\n })(\n !(typeof (window as any).safari === \"undefined\") &&\n (window as any).safari.pushNotification\n )\n ) {\n detections.push({ name: \"Safari\", confidence: 70 });\n }\n\n // Basic Edge detection - more detailed in detectEdgeBrowser function\n if ((window as any).msCredentials || (document as any).documentMode) {\n detections.push({ name: \"Edge\", confidence: 60 }); // Increased confidence\n }\n\n // Opera detection\n if ((window as any).opr || (window as any).opera) {\n detections.push({ name: \"Opera\", confidence: 60 });\n }\n}\n\n/**\n * Detects browser by checking for browser-specific protocol handlers\n */\nfunction detectByProtocolHandlers(\n detections: { name: string; confidence: number }[]\n): void {\n // Chrome/Chromium protocols\n if (typeof navigator.registerProtocolHandler === \"function\") {\n try {\n if (\"chrome\" in (window as any)) {\n // Only consider chrome protocol if not Edge\n const ua = navigator.userAgent.toLowerCase();\n if (ua.indexOf(\"edg/\") === -1 && ua.indexOf(\"edge/\") === -1) {\n detections.push({ name: \"Chrome\", confidence: 25 }); // Increased from 15\n }\n }\n\n // Edge has ms-* protocols available\n if (\n \"ms-access\" in (navigator as any) ||\n \"ms-browser-extension\" in (navigator as any) ||\n \"ms-calculator\" in (navigator as any) ||\n \"ms-drive-to\" in (navigator as any) ||\n \"ms-excel\" in (navigator as any) ||\n \"ms-gamebarservices\" in (navigator as any) ||\n \"ms-search\" in (navigator as any) ||\n \"ms-word\" in (navigator as any)\n ) {\n detections.push({ name: \"Edge\", confidence: 80 }); // Increased confidence\n }\n\n // Opera has specific protocol handlers\n if (\"opr:\" in navigator.plugins || \"opera:\" in navigator.plugins) {\n detections.push({ name: \"Opera\", confidence: 25 });\n }\n } catch (e) {\n // Protocol detection failed\n }\n }\n}\n\n/**\n * Detects browser by checking for browser-specific CSS properties\n */\nfunction detectByCssProperties(\n detections: { name: string; confidence: number }[]\n): void {\n const docStyle = window.getComputedStyle(document.documentElement);\n\n // Webkit-specific properties\n if (\n docStyle.getPropertyValue(\"--apple-trailing-word\") !== \"\" ||\n docStyle.getPropertyValue(\"-webkit-app-region\") !== \"\"\n ) {\n detections.push({ name: \"Safari\", confidence: 20 });\n }\n\n // Firefox-specific properties\n if (\n docStyle.getPropertyValue(\"-moz-context-properties\") !== \"\" ||\n docStyle.getPropertyValue(\"-moz-user-focus\") !== \"\"\n ) {\n detections.push({ name: \"Firefox\", confidence: 20 });\n }\n\n // Edge-specific CSS properties\n if (\n docStyle.getPropertyValue(\"-ms-ime-align\") !== \"\" ||\n docStyle.getPropertyValue(\"-ms-flow-from\") !== \"\"\n ) {\n detections.push({ name: \"Edge\", confidence: 60 }); // Increased confidence\n }\n}\n\n/**\n * Detects browser by analyzing performance characteristics\n */\nfunction detectByPerformance(\n detections: { name: string; confidence: number }[]\n): void {\n // Chrome/Chromium-based browsers expose memory info\n if (\n (performance as any).memory &&\n (performance as any).memory.jsHeapSizeLimit\n ) {\n // Different Chromium browsers have different heap size limits\n const heapLimit = (performance as any).memory.jsHeapSizeLimit;\n\n if (heapLimit > 2000000000) {\n // Check if it's not actually Edge before assuming Chrome\n const ua = navigator.userAgent.toLowerCase();\n if (ua.indexOf(\"edg/\") === -1 && ua.indexOf(\"edge/\") === -1) {\n detections.push({ name: \"Chrome\", confidence: 20 }); // Increased from 10\n }\n }\n }\n\n // Chrome-specific performance timing features\n if (\n typeof (window as any).chrome !== \"undefined\" &&\n typeof (window as any).chrome.loadTimes === \"function\"\n ) {\n try {\n const chromeLoad = (window as any).chrome.loadTimes();\n if (\n chromeLoad &&\n typeof chromeLoad.firstPaintTime === \"number\" &&\n typeof chromeLoad.requestTime === \"number\"\n ) {\n detections.push({ name: \"Chrome\", confidence: 30 });\n }\n } catch (e) {\n // Performance timing check failed\n }\n }\n}\n\n/**\n * Detects browser by JavaScript behavior patterns\n */\nfunction detectByJsBehavior(\n detections: { name: string; confidence: number }[]\n): void {\n // Firefox specific behavior with error stack\n try {\n throw new Error();\n } catch (err: any) {\n if (err.stack && err.stack.indexOf(\"()@\") >= 0) {\n detections.push({ name: \"Firefox\", confidence: 15 });\n }\n\n // Chrome-specific stack trace format\n if (err.stack && err.stack.indexOf(\"at new\") >= 0) {\n // Check if it's not actually Edge\n const ua = navigator.userAgent.toLowerCase();\n if (ua.indexOf(\"edg/\") === -1 && ua.indexOf(\"edge/\") === -1) {\n detections.push({ name: \"Chrome\", confidence: 20 }); // Increased from 10\n }\n }\n\n // Safari-specific stack trace format\n if (\n err.stack &&\n err.stack.indexOf(\"@\") === -1 &&\n err.stack.indexOf(\"at \") === -1\n ) {\n detections.push({ name: \"Safari\", confidence: 15 });\n }\n }\n\n // Brave shields detection\n if (\n document.createElement(\"canvas\").toDataURL().length > 15 &&\n (navigator as any).brave === undefined &&\n typeof (window as any).chrome !== \"undefined\"\n ) {\n // Try to detect if Brave shields are on\n const img = new Image();\n let loadCount = 0;\n\n img.onload = () => {\n loadCount++;\n if (loadCount === 0) {\n detections.push({ name: \"Brave\", confidence: 20 });\n }\n };\n\n img.onerror = () => {\n detections.push({ name: \"Brave\", confidence: 10 });\n };\n\n // Try loading a tracking pixel\n img.src = \"https://www.facebook.com/tr?id=1234567890&ev=PageView\";\n }\n\n // Additional Chrome-specific behavior check (Chrome DevTools Protocol)\n try {\n // Check if __JQUERY_OBJECT__ is defined (used in Chrome Developer Tools)\n // This will throw an error in most other browsers\n const hasDevTools = !!(window as any).__JQUERY_OBJECT__;\n if (hasDevTools) {\n detections.push({ name: \"Chrome\", confidence: 15 });\n }\n } catch (e) {\n // DevTools check failed\n }\n\n // Check Chrome user agent pattern more directly when combined with other Chrome features\n if (\n navigator.userAgent.indexOf(\"Chrome\") !== -1 &&\n navigator.userAgent.indexOf(\"Edg\") === -1 &&\n navigator.userAgent.indexOf(\"OPR\") === -1 &&\n navigator.userAgent.indexOf(\"Brave\") === -1 &&\n typeof (window as any).chrome !== \"undefined\" &&\n (window as any).chrome.runtime\n ) {\n detections.push({ name: \"Chrome\", confidence: 35 });\n }\n}\n\n/**\n * Specialized Edge browser detection to differentiate it from Chrome\n */\nfunction detectEdgeBrowser(\n detections: { name: string; confidence: number }[]\n): void {\n // Check for Edge in User Agent as a supplementary signal (still useful)\n const ua = navigator.userAgent.toLowerCase();\n if (ua.indexOf(\"edg/\") !== -1 || ua.indexOf(\"edge/\") !== -1) {\n detections.push({ name: \"Edge\", confidence: 80 }); // Increased from 30 to 80\n }\n\n // Check for Edge-specific objects\n try {\n // Check for CSS.supports method with -ms vendor prefix\n if (CSS.supports(\"-ms-ime-align\", \"auto\")) {\n detections.push({ name: \"Edge\", confidence: 70 }); // Increased confidence\n }\n } catch (e) {\n // CSS.supports might not be available\n }\n\n // Check for Edge-specific behaviors\n try {\n // Test if msLaunchUri is available (Edge-specific)\n if (typeof (navigator as any).msLaunchUri === \"function\") {\n detections.push({ name: \"Edge\", confidence: 85 }); // Increased confidence\n }\n\n // Test if MS-specific APIs are available\n if (typeof (window as any).MSInputMethodContext !== \"undefined\") {\n detections.push({ name: \"Edge\", confidence: 80 }); // Increased confidence\n }\n\n // Check for Edge-specific storage behavior\n if ((document as any).documentMode || /edge/i.test(navigator.userAgent)) {\n detections.push({ name: \"Edge\", confidence: 75 }); // Increased confidence\n }\n\n // Check window.chrome properties patterns specific to Edge\n if (\n typeof (window as any).chrome !== \"undefined\" &&\n (window as any).chrome.runtime &&\n !(window as any).chrome.webstore\n ) {\n // This combination is more common in Edge than Chrome\n detections.push({ name: \"Edge\", confidence: 60 }); // Increased confidence\n }\n } catch (e) {\n // Ignore errors in detection\n }\n\n // Get text rendering metrics - Edge and Chrome render text differently\n try {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (ctx) {\n canvas.width = 200;\n canvas.height = 50;\n ctx.font = \"20px Arial\";\n ctx.textBaseline = \"top\";\n ctx.fillText(\"EdgeBrowserTest\", 0, 0);\n\n // Get image data to analyze text rendering\n const imageData = ctx.getImageData(\n 0,\n 0,\n canvas.width,\n canvas.height\n ).data;\n\n // Create a simple hash of the first few pixels\n let hash = 0;\n for (let i = 0; i < 400; i += 4) {\n hash = (hash << 5) - hash + imageData[i];\n }\n\n // Edge typically has different text rendering than Chrome\n if (hash < 0) {\n // Just an example threshold, would need calibration\n detections.push({ name: \"Edge\", confidence: 50 }); // Increased confidence\n }\n }\n } catch (e) {\n // Canvas access might be restricted\n }\n}\n\n/**\n * Enhanced detection for Chrome browser\n */\nfunction detectChromeBrowser(\n detections: { name: string; confidence: number }[]\n): void {\n // Complex feature combination check specific to Chrome but not other Chromium browsers\n if (\n // Must have Chrome in user agent but not be Edge or Opera\n navigator.userAgent.indexOf(\"Chrome\") !== -1 &&\n navigator.userAgent.indexOf(\"Edg\") === -1 &&\n navigator.userAgent.indexOf(\"OPR\") === -1 &&\n // Must have chrome object with specific properties\n typeof (window as any).chrome !== \"undefined\" &&\n (window as any).chrome.runtime &&\n // Check for Chrome-exclusive features\n typeof (window as any).chrome.loadTimes === \"function\" &&\n typeof (window as any).chrome.csi === \"function\" &&\n // Ensure not Brave\n typeof (navigator as any).brave === \"undefined\"\n ) {\n detections.push({ name: \"Chrome\", confidence: 75 });\n }\n\n // Check for Chrome PDF viewer plugin (generally not present in other Chromium browsers)\n try {\n const hasPdfViewer = Array.from(navigator.plugins).some(\n (plugin) => plugin.name === \"Chrome PDF Viewer\"\n );\n\n if (\n hasPdfViewer &&\n navigator.userAgent.indexOf(\"Chrome\") !== -1 &&\n navigator.userAgent.indexOf(\"Edg\") === -1\n ) {\n detections.push({ name: \"Chrome\", confidence: 60 });\n }\n } catch (e) {\n // Plugin check failed\n }\n\n // Check Chrome version consistency in User Agent\n // This helps differentiate from browsers that modify the Chrome version string\n try {\n const chromeMatch = navigator.userAgent.match(/Chrome\\/([0-9.]+)/);\n if (chromeMatch) {\n const chromeVersion = chromeMatch[1];\n\n // If app version contains the Chrome version and doesn't have Edg\n if (\n navigator.appVersion.indexOf(chromeVersion) !== -1 &&\n navigator.userAgent.indexOf(\"Edg\") === -1 &&\n navigator.userAgent.indexOf(\"OPR\") === -1\n ) {\n detections.push({ name: \"Chrome\", confidence: 30 });\n }\n }\n } catch (e) {\n // Version check failed\n }\n}\n\n/**\n * Attempts to get the browser version\n */\nfunction getBrowserVersion(browserName: string): string {\n const userAgent = navigator.userAgent;\n let version = \"Unknown\";\n\n try {\n if (browserName === \"Chrome\") {\n const match = userAgent.match(/Chrome\\/([0-9.]+)/);\n if (match) {\n version = match[1];\n }\n } else if (browserName === \"Firefox\") {\n const match = userAgent.match(/Firefox\\/([0-9.]+)/);\n if (match) {\n version = match[1];\n }\n } else if (browserName === \"Safari\") {\n const match = userAgent.match(/Version\\/([0-9.]+)/);\n if (match) {\n version = match[1];\n }\n } else if (browserName === \"Edge\") {\n // Modern Edge (Chromium-based)\n const edgeMatch = userAgent.match(/Edg(?:e)?\\/([0-9.]+)/);\n if (edgeMatch) {\n version = edgeMatch[1];\n }\n } else if (browserName === \"Opera\") {\n const match = userAgent.match(/OPR\\/([0-9.]+)/);\n if (match) {\n version = match[1];\n }\n } else if (browserName === \"Brave\") {\n // First try to get version through Brave API if available\n if ((navigator as any).brave && (navigator as any).brave.version) {\n version = (navigator as any).brave.version;\n } else {\n // Otherwise extract from user agent like Chrome\n // Brave uses the same Chrome version string but with Brave/[version]\n const braveMatch = userAgent.match(/Brave\\/([0-9.]+)/);\n if (braveMatch) {\n version = braveMatch[1];\n } else {\n // Fall back to Chrome version\n const chromeMatch = userAgent.match(/Chrome\\/([0-9.]+)/);\n if (chromeMatch) {\n version = chromeMatch[1];\n }\n }\n\n // Try to access the Brave browser version via JavaScript API if available\n if (typeof (navigator as any).brave !== \"undefined\") {\n try {\n // Request brave version info\n (navigator as any).brave.isBrave().then((isBrave: boolean) => {\n if (isBrave) {\n // Remove console log\n }\n });\n } catch (e) {\n // API access failed\n }\n }\n }\n }\n } catch (e) {\n // Keep default 'Unknown' value\n }\n\n return version;\n}\ninterface BrowserResult {\n name: string;\n version: string;\n}\n\nexport function getBrowser(): BrowserResult {\n if (typeof navigator === \"undefined\") {\n return {\n name: \"unknown\",\n version: \"unknown\",\n };\n }\n const ua = navigator.userAgent;\n // Define some regular expressions to match different browsers and their versions\n const regexes = [\n // Edge\n /(?<name>Edge|Edg)\\/(?<version>\\d+(?:\\.\\d+)?)/,\n // Chrome, Chromium, Opera, Vivaldi, Brave, etc.\n /(?<name>(?:Chrome|Chromium|OPR|Opera|Vivaldi|Brave))\\/(?<version>\\d+(?:\\.\\d+)?)/,\n // Firefox, Waterfox, etc.\n /(?<name>(?:Firefox|Waterfox|Iceweasel|IceCat))\\/(?<version>\\d+(?:\\.\\d+)?)/,\n // Safari, Mobile Safari, etc.\n /(?<name>Safari)\\/(?<version>\\d+(?:\\.\\d+)?)/,\n // Internet Explorer, IE Mobile, etc.\n /(?<name>MSIE|Trident|IEMobile).+?(?<version>\\d+(?:\\.\\d+)?)/,\n // Other browsers that use the format \"BrowserName/version\"\n /(?<name>[A-Za-z]+)\\/(?<version>\\d+(?:\\.\\d+)?)/,\n // Samsung internet browser\n /(?<name>SamsungBrowser)\\/(?<version>\\d+(?:\\.\\d+)?)/,\n // Samsung browser (Tizen format)\n /(?<name>samsung).*Version\\/(?<version>\\d+(?:\\.\\d+)?)/i,\n ];\n\n // Define a map for browser name translations\n const browserNameMap: { [key: string]: string } = {\n edg: \"Edge\",\n opr: \"Opera\",\n samsung: \"SamsungBrowser\",\n };\n\n // Loop through the regexes and try to find a match\n for (const regex of regexes) {\n const match = ua.match(regex);\n if (match && match.groups) {\n // Translate the browser name if necessary\n const name =\n browserNameMap[match.groups.name.toLowerCase()] || match.groups.name;\n // Return the browser name and version\n return {\n name: name,\n version: match.groups.version,\n };\n }\n }\n\n // If no match is found, return unknown\n return {\n name: \"unknown\",\n version: \"unknown\",\n };\n}\n","// Generated ESM version of ua-parser-js\n// DO NOT EDIT THIS FILE!\n// Source: /src/main/ua-parser.js\n\n/////////////////////////////////////////////////////////////////////////////////\n/* UAParser.js v2.0.4\n Copyright © 2012-2025 Faisal Salman <f@faisalman.com>\n AGPLv3 License *//*\n Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.\n Supports browser & node.js environment. \n Demo : https://uaparser.dev\n Source : https://github.com/faisalman/ua-parser-js */\n/////////////////////////////////////////////////////////////////////////////////\n\n/* jshint esversion: 6 */ \n/* globals window */\n\n\n \n //////////////\n // Constants\n /////////////\n\n var LIBVERSION = '2.0.4',\n UA_MAX_LENGTH = 500,\n USER_AGENT = 'user-agent',\n EMPTY = '',\n UNKNOWN = '?',\n\n // typeof\n FUNC_TYPE = 'function',\n UNDEF_TYPE = 'undefined',\n OBJ_TYPE = 'object',\n STR_TYPE = 'string',\n\n // properties\n UA_BROWSER = 'browser',\n UA_CPU = 'cpu',\n UA_DEVICE = 'device',\n UA_ENGINE = 'engine',\n UA_OS = 'os',\n UA_RESULT = 'result',\n \n NAME = 'name',\n TYPE = 'type',\n VENDOR = 'vendor',\n VERSION = 'version',\n ARCHITECTURE= 'architecture',\n MAJOR = 'major',\n MODEL = 'model',\n\n // device types\n CONSOLE = 'console',\n MOBILE = 'mobile',\n TABLET = 'tablet',\n SMARTTV = 'smarttv',\n WEARABLE = 'wearable',\n XR = 'xr',\n EMBEDDED = 'embedded',\n\n // browser types\n INAPP = 'inapp',\n\n // client hints\n BRANDS = 'brands',\n FORMFACTORS = 'formFactors',\n FULLVERLIST = 'fullVersionList',\n PLATFORM = 'platform',\n PLATFORMVER = 'platformVersion',\n BITNESS = 'bitness',\n CH_HEADER = 'sec-ch-ua',\n CH_HEADER_FULL_VER_LIST = CH_HEADER + '-full-version-list',\n CH_HEADER_ARCH = CH_HEADER + '-arch',\n CH_HEADER_BITNESS = CH_HEADER + '-' + BITNESS,\n CH_HEADER_FORM_FACTORS = CH_HEADER + '-form-factors',\n CH_HEADER_MOBILE = CH_HEADER + '-' + MOBILE,\n CH_HEADER_MODEL = CH_HEADER + '-' + MODEL,\n CH_HEADER_PLATFORM = CH_HEADER + '-' + PLATFORM,\n CH_HEADER_PLATFORM_VER = CH_HEADER_PLATFORM + '-version',\n CH_ALL_VALUES = [BRANDS, FULLVERLIST, MOBILE, MODEL, PLATFORM, PLATFORMVER, ARCHITECTURE, FORMFACTORS, BITNESS],\n\n // device vendors\n AMAZON = 'Amazon',\n APPLE = 'Apple',\n ASUS = 'ASUS',\n BLACKBERRY = 'BlackBerry',\n GOOGLE = 'Google',\n HUAWEI = 'Huawei',\n LENOVO = 'Lenovo',\n HONOR = 'Honor',\n LG = 'LG',\n MICROSOFT = 'Microsoft',\n MOTOROLA = 'Motorola',\n NVIDIA = 'Nvidia',\n ONEPLUS = 'OnePlus',\n OPPO = 'OPPO',\n SAMSUNG = 'Samsung',\n SHARP = 'Sharp',\n SONY = 'Sony',\n XIAOMI = 'Xiaomi',\n ZEBRA = 'Zebra',\n\n // browsers\n CHROME = 'Chrome',\n CHROMIUM = 'Chromium',\n CHROMECAST = 'Chromecast',\n EDGE = 'Edge',\n FIREFOX = 'Firefox',\n OPERA = 'Opera',\n FACEBOOK = 'Facebook',\n SOGOU = 'Sogou',\n\n PREFIX_MOBILE = 'Mobile ',\n SUFFIX_BROWSER = ' Browser',\n\n // os\n WINDOWS = 'Windows';\n \n var isWindow = typeof window !== UNDEF_TYPE,\n NAVIGATOR = (isWindow && window.navigator) ? \n window.navigator : \n undefined,\n NAVIGATOR_UADATA = (NAVIGATOR && NAVIGATOR.userAgentData) ? \n NAVIGATOR.userAgentData : \n undefined;\n\n ///////////\n // Helper\n //////////\n\n var extend = function (defaultRgx, extensions) {\n var mergedRgx = {};\n var extraRgx = extensions;\n if (!isExtensions(extensions)) {\n extraRgx = {};\n for (var i in extensions) {\n for (var j in extensions[i]) {\n extraRgx[j] = extensions[i][j].concat(extraRgx[j] ? extraRgx[j] : []);\n }\n }\n }\n for (var k in defaultRgx) {\n mergedRgx[k] = extraRgx[k] && extraRgx[k].length % 2 === 0 ? extraRgx[k].concat(defaultRgx[k]) : defaultRgx[k];\n }\n return mergedRgx;\n },\n enumerize = function (arr) {\n var enums = {};\n for (var i=0; i<arr.length; i++) {\n enums[arr[i].toUpperCase()] = arr[i];\n }\n return enums;\n },\n has = function (str1, str2) {\n if (typeof str1 === OBJ_TYPE && str1.length > 0) {\n for (var i in str1) {\n if (lowerize(str2) == lowerize(str1[i])) return true;\n }\n return false;\n }\n return isString(str1) ? lowerize(str2) == lowerize(str1) : false;\n },\n isExtensions = function (obj, deep) {\n for (var prop in obj) {\n return /^(browser|cpu|device|engine|os)$/.test(prop) || (deep ? isExtensions(obj[prop]) : false);\n }\n },\n isString = function (val) {\n return typeof val === STR_TYPE;\n },\n itemListToArray = function (header) {\n if (!header) return undefined;\n var arr = [];\n var tokens = strip(/\\\\?\\\"/g, header).split(',');\n for (var i = 0; i < tokens.length; i++) {\n if (tokens[i].indexOf(';') > -1) {\n var token = trim(tokens[i]).split(';v=');\n arr[i] = { brand : token[0], version : token[1] };\n } else {\n arr[i] = trim(tokens[i]);\n }\n }\n return arr;\n },\n lowerize = function (str) {\n return isString(str) ? str.toLowerCase() : str;\n },\n majorize = function (version) {\n return isString(version) ? strip(/[^\\d\\.]/g, version).split('.')[0] : undefined;\n },\n setProps = function (arr) {\n for (var i in arr) {\n var propName = arr[i];\n if (typeof propName == OBJ_TYPE && propName.length == 2) {\n this[propName[0]] = propName[1];\n } else {\n this[propName] = undefined;\n }\n }\n return this;\n },\n strip = function (pattern, str) {\n return isString(str) ? str.replace(pattern, EMPTY) : str;\n },\n stripQuotes = function (str) {\n return strip(/\\\\?\\\"/g, str); \n },\n trim = function (str, len) {\n if (isString(str)) {\n str = strip(/^\\s\\s*/, str);\n return typeof len === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);\n }\n };\n\n ///////////////\n // Map helper\n //////////////\n\n var rgxMapper = function (ua, arrays) {\n\n if(!ua || !arrays) return;\n\n var i = 0, j, k, p, q, matches, match;\n\n // loop through all regexes maps\n while (i < arrays.length && !matches) {\n\n var regex = arrays[i], // even sequence (0,2,4,..)\n props = arrays[i + 1]; // odd sequence (1,3,5,..)\n j = k = 0;\n\n // try matching uastring with regexes\n while (j < regex.length && !matches) {\n\n if (!regex[j]) { break; }\n matches = regex[j++].exec(ua);\n\n if (!!matches) {\n for (p = 0; p < props.length; p++) {\n match = matches[++k];\n q = props[p];\n // check if given property is actually array\n if (typeof q === OBJ_TYPE && q.length > 0) {\n if (q.length === 2) {\n if (typeof q[1] == FUNC_TYPE) {\n // assign modified match\n this[q[0]] = q[1].call(this, match);\n } else {\n // assign given value, ignore regex match\n this[q[0]] = q[1];\n }\n } else if (q.length >= 3) {\n // Check whether q[1] FUNCTION or REGEX\n if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {\n if (q.length > 3) {\n this[q[0]] = match ? q[1].apply(this, q.slice(2)) : undefined;\n } else {\n // call function (usually string mapper)\n this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;\n }\n } else {\n if (q.length == 3) {\n // sanitize match using given regex\n this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;\n } else if (q.length == 4) {\n this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;\n } else if (q.length > 4) {\n this[q[0]] = match ? q[3].apply(this, [match.replace(q[1], q[2])].concat(q.slice(4))) : undefined;\n }\n }\n }\n } else {\n this[q] = match ? match : undefined;\n }\n }\n }\n }\n i += 2;\n }\n },\n\n strMapper = function (str, map) {\n\n for (var i in map) {\n // check if current value is array\n if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {\n for (var j = 0; j < map[i].length; j++) {\n if (has(map[i][j], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n } else if (has(map[i], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n return map.hasOwnProperty('*') ? map['*'] : str;\n };\n\n ///////////////\n // String map\n //////////////\n\n var windowsVersionMap = {\n 'ME' : '4.90',\n 'NT 3.51': '3.51',\n 'NT 4.0': '4.0',\n '2000' : ['5.0', '5.01'],\n 'XP' : ['5.1', '5.2'],\n 'Vista' : '6.0',\n '7' : '6.1',\n '8' : '6.2',\n '8.1' : '6.3',\n '10' : ['6.4', '10.0'],\n 'NT' : ''\n },\n \n formFactorsMap = {\n 'embedded' : 'Automotive',\n 'mobile' : 'Mobile',\n 'tablet' : ['Tablet', 'EInk'],\n 'smarttv' : 'TV',\n 'wearable' : 'Watch',\n 'xr' : ['VR', 'XR'],\n '?' : ['Desktop', 'Unknown'],\n '*' : undefined\n },\n\n browserHintsMap = {\n 'Chrome' : 'Google Chrome',\n 'Edge' : 'Microsoft Edge',\n 'Edge WebView2' : 'Microsoft Edge WebView2',\n 'Chrome WebView': 'Android WebView',\n 'Chrome Headless':'HeadlessChrome',\n 'Huawei Browser': 'HuaweiBrowser',\n 'MIUI Browser' : 'Miui Browser',\n 'Opera Mobi' : 'OperaMobile',\n 'Yandex' : 'YaBrowser'\n };\n\n //////////////\n // Regex map\n /////////////\n\n var defaultRegexes = {\n\n browser : [[\n\n // Most common regardless engine\n /\\b(?:crmo|crios)\\/([\\w\\.]+)/i // Chrome for Android/iOS\n ], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [\n /webview.+edge\\/([\\w\\.]+)/i // Microsoft Edge\n ], [VERSION, [NAME, EDGE+' WebView']], [\n /edg(?:e|ios|a)?\\/([\\w\\.]+)/i \n ], [VERSION, [NAME, 'Edge']], [\n\n // Presto based\n /(opera mini)\\/([-\\w\\.]+)/i, // Opera Mini\n /(opera [mobiletab]{3,6})\\b.+version\\/([-\\w\\.]+)/i, // Opera Mobi/Tablet\n /(opera)(?:.+version\\/|[\\/ ]+)([\\w\\.]+)/i // Opera\n ], [NAME, VERSION], [\n /opios[\\/ ]+([\\w\\.]+)/i // Opera mini on iphone >= 8.0\n ], [VERSION, [NAME, OPERA+' Mini']], [\n /\\bop(?:rg)?x\\/([\\w\\.]+)/i // Opera GX\n ], [VERSION, [NAME, OPERA+' GX']], [\n /\\bopr\\/([\\w\\.]+)/i // Opera Webkit\n ], [VERSION, [NAME, OPERA]], [\n\n // Mixed\n /\\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\\/ ]?([\\w\\.]+)/i // Baidu\n ], [VERSION, [NAME, 'Baidu']], [\n /\\b(?:mxbrowser|mxios|myie2)\\/?([-\\w\\.]*)\\b/i // Maxthon\n ], [VERSION, [NAME, 'Maxthon']], [\n /(kindle)\\/([\\w\\.]+)/i, // Kindle\n /(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\\/ ]?([\\w\\.]*)/i, \n // Lunascape/Maxthon/Netfront/Jasmine/Blazer/Sleipnir\n // Trident based\n /(avant|iemobile|slim(?:browser|boat|jet))[\\/ ]?([\\d\\.]*)/i, // Avant/IEMobile/SlimBrowser/SlimBoat/Slimjet\n /(?:ms|\\()(ie) ([\\w\\.]+)/i, // Internet Explorer\n\n // Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon/LG Browser/Otter/qutebrowser/Dooble\n /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:lg |qute)browser)\\/([-\\w\\.]+)/i,\n // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon\n /(heytap|ovi|115|surf)browser\\/([\\d\\.]+)/i, // HeyTap/Ovi/115/Surf\n /(ecosia|weibo)(?:__| \\w+@)([\\d\\.]+)/i // Ecosia/Weibo\n ], [NAME, VERSION], [\n /quark(?:pc)?\\/([-\\w\\.]+)/i // Quark\n ], [VERSION, [NAME, 'Quark']], [\n /\\bddg\\/([\\w\\.]+)/i // DuckDuckGo\n ], [VERSION, [NAME, 'DuckDuckGo']], [\n /(?:\\buc? ?browser|(?:juc.+)ucweb)[\\/ ]?([\\w\\.]+)/i // UCBrowser\n ], [VERSION, [NAME, 'UCBrowser']], [\n /microm.+\\bqbcore\\/([\\w\\.]+)/i, // WeChat Desktop for Windows Built-in Browser\n /\\bqbcore\\/([\\w\\.]+).+microm/i,\n /micromessenger\\/([\\w\\.]+)/i // WeChat\n ], [VERSION, [NAME, 'WeChat']], [\n /konqueror\\/([\\w\\.]+)/i // Konqueror\n ], [VERSION, [NAME, 'Konqueror']], [\n /trident.+rv[: ]([\\w\\.]{1,9})\\b.+like gecko/i // IE11\n ], [VERSION, [NAME, 'IE']], [\n /ya(?:search)?browser\\/([\\w\\.]+)/i // Yandex\n ], [VERSION, [NAME, 'Yandex']], [\n /slbrowser\\/([\\w\\.]+)/i // Smart Lenovo Browser\n ], [VERSION, [NAME, 'Smart ' + LENOVO + SUFFIX_BROWSER]], [\n /(avast|avg)\\/([\\w\\.]+)/i // Avast/AVG Secure Browser\n ], [[NAME, /(.+)/, '$1 Secure' + SUFFIX_BROWSER], VERSION], [\n /\\bfocus\\/([\\w\\.]+)/i // Firefox Focus\n ], [VERSION, [NAME, FIREFOX+' Focus']], [\n /\\bopt\\/([\\w\\.]+)/i // Opera Touch\n ], [VERSION, [NAME, OPERA+' Touch']], [\n /coc_coc\\w+\\/([\\w\\.]+)/i // Coc Coc Browser\n ], [VERSION, [NAME, 'Coc Coc']], [\n /dolfin\\/([\\w\\.]+)/i // Dolphin\n ], [VERSION, [NAME, 'Dolphin']], [\n /coast\\/([\\w\\.]+)/i // Opera Coast\n ], [VERSION, [NAME, OPERA+' Coast']], [\n /miuibrowser\\/([\\w\\.]+)/i // MIUI Browser\n ], [VERSION, [NAME, 'MIUI' + SUFFIX_BROWSER]], [\n /fxios\\/([\\w\\.-]+)/i // Firefox for iOS\n ], [VERSION, [NAME, PREFIX_MOBILE + FIREFOX]], [\n /\\bqihoobrowser\\/?([\\w\\.]*)/i // 360\n ], [VERSION, [NAME, '360']], [\n /\\b(qq)\\/([\\w\\.]+)/i // QQ\n ], [[NAME, /(.+)/, '$1Browser'], VERSION], [\n /(oculus|sailfish|huawei|vivo|pico)browser\\/([\\w\\.]+)/i\n ], [[NAME, /(.+)/, '$1' + SUFFIX_BROWSER], VERSION], [ // Oculus/Sailfish/HuaweiBrowser/VivoBrowser/PicoBrowser\n /samsungbrowser\\/([\\w\\.]+)/i // Samsung Internet\n ], [VERSION, [NAME, SAMSUNG + ' Internet']], [\n /metasr[\\/ ]?([\\d\\.]+)/i // Sogou Explorer\n ], [VERSION, [NAME, SOGOU + ' Explorer']], [\n /(sogou)mo\\w+\\/([\\d\\.]+)/i // Sogou Mobile\n ], [[NAME, SOGOU + ' Mobile'], VERSION], [\n /(electron)\\/([\\w\\.]+) safari/i, // Electron-based App\n /(tesla)(?: qtcarbrowser|\\/(20\\d\\d\\.[-\\w\\.]+))/i, // Tesla\n /m?(qqbrowser|2345(?=browser|chrome|explorer))\\w*[\\/ ]?v?([\\w\\.]+)/i // QQ/2345\n ], [NAME, VERSION], [\n /(lbbrowser|rekonq)/i // LieBao Browser/Rekonq\n ], [NAME], [\n /ome\\/([\\w\\.]+) \\w* ?(iron) saf/i, // Iron\n /ome\\/([\\w\\.]+).+qihu (360)[es]e/i // 360\n ], [VERSION, NAME], [\n\n // WebView\n /((?:fban\\/fbios|fb_iab\\/fb4a)(?!.+fbav)|;fbav\\/([\\w\\.]+);)/i // Facebook App for iOS & Android\n ], [[NAME, FACEBOOK], VERSION, [TYPE, INAPP]], [\n /(kakao(?:talk|story))[\\/ ]([\\w\\.]+)/i, // Kakao App\n /(naver)\\(.*?(\\d+\\.[\\w\\.]+).*\\)/i, // Naver InApp\n /(daum)apps[\\/ ]([\\w\\.]+)/i, // Daum App\n /safari (line)\\/([\\w\\.]+)/i, // Line App for iOS\n /\\b(line)\\/([\\w\\.]+)\\/iab/i, // Line App for Android\n /(alipay)client\\/([\\w\\.]+)/i, // Alipay\n /(twitter)(?:and| f.+e\\/([\\w\\.]+))/i, // Twitter\n /(instagram|snapchat|klarna)[\\/ ]([-\\w\\.]+)/i // Instagram/Snapchat/Klarna\n ], [NAME, VERSION, [TYPE, INAPP]], [\n /\\bgsa\\/([\\w\\.]+) .*safari\\//i // Google Search Appliance on iOS\n ], [VERSION, [NAME, 'GSA'], [TYPE, INAPP]], [\n /musical_ly(?:.+app_?version\\/|_)([\\w\\.]+)/i // TikTok\n ], [VERSION, [NAME, 'TikTok'], [TYPE, INAPP]], [\n /\\[(linkedin)app\\]/i // LinkedIn App for iOS & Android\n ], [NAME, [TYPE, INAPP]], [\n\n /(chromium)[\\/ ]([-\\w\\.]+)/i // Chromium\n ], [NAME, VERSION], [\n\n /headlesschrome(?:\\/([\\w\\.]+)| )/i // Chrome Headless\n ], [VERSION, [NAME, CHROME+' Headless']], [\n\n /wv\\).+chrome\\/([\\w\\.]+).+edgw\\//i // Edge WebView2\n ], [VERSION, [NAME, EDGE+' WebView2']], [\n\n / wv\\).+(chrome)\\/([\\w\\.]+)/i // Chrome WebView\n ], [[NAME, CHROME+' WebView'], VERSION], [\n\n /droid.+ version\\/([\\w\\.]+)\\b.+(?:mobile safari|safari)/i // Android Browser\n ], [VERSION, [NAME, 'Android' + SUFFIX_BROWSER]], [\n\n /chrome\\/([\\w\\.]+) mobile/i // Chrome Mobile\n ], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [\n\n /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\\/v?([\\w\\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia\n ], [NAME, VERSION], [\n\n /version\\/([\\w\\.\\,]+) .*mobile(?:\\/\\w+ | ?)safari/i // Safari Mobile\n ], [VERSION, [NAME, PREFIX_MOBILE + 'Safari']], [\n /iphone .*mobile(?:\\/\\w+ | ?)safari/i\n ], [[NAME, PREFIX_MOBILE + 'Safari']], [\n /version\\/([\\w\\.\\,]+) .*(safari)/i // Safari\n ], [VERSION, NAME], [\n /webkit.+?(mobile ?safari|safari)(\\/[\\w\\.]+)/i // Safari < 3.0\n ], [NAME, [VERSION, '1']], [\n\n /(webkit|khtml)\\/([\\w\\.]+)/i\n ], [NAME, VERSION], [\n\n // Gecko based\n /(?:mobile|tablet);.*(firefox)\\/([\\w\\.-]+)/i // Firefox Mobile\n ], [[NAME, PREFIX_MOBILE + FIREFOX], VERSION], [\n /(navigator|netscape\\d?)\\/([-\\w\\.]+)/i // Netscape\n ], [[NAME, 'Netscape'], VERSION], [\n /(wolvic|librewolf)\\/([\\w\\.]+)/i // Wolvic/LibreWolf\n ], [NAME, VERSION], [\n /mobile vr; rv:([\\w\\.]+)\\).+firefox/i // Firefox Reality\n ], [VERSION, [NAME, FIREFOX+' Reality']], [\n /ekiohf.+(flow)\\/([\\w\\.]+)/i, // Flow\n /(swiftfox)/i, // Swiftfox\n /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\\/ ]?([\\w\\.\\+]+)/i,\n // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror\n /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\\/([-\\w\\.]+)$/i,\n // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix\n /(firefox)\\/([\\w\\.]+)/i, // Other Firefox-based\n /(mozilla)\\/([\\w\\.]+) .+rv\\:.+gecko\\/\\d+/i, // Mozilla\n\n // Other\n /(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\\. ]?browser)[-\\/ ]?v?([\\w\\.]+)/i,\n // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser/Ladybird\n /\\b(links) \\(([\\w\\.]+)/i // Links\n ], [NAME, [VERSION, /_/g, '.']], [\n \n /(cobalt)\\/([\\w\\.]+)/i // Cobalt\n ], [NAME, [VERSION, /[^\\d\\.]+./, EMPTY]]\n ],\n\n cpu : [[\n\n /\\b((amd|x|x86[-_]?|wow|win)64)\\b/i // AMD64 (x64)\n ], [[ARCHITECTURE, 'amd64']], [\n\n /(ia32(?=;))/i, // IA32 (quicktime)\n /\\b((i[346]|x)86)(pc)?\\b/i // IA32 (x86)\n ], [[ARCHITECTURE, 'ia32']], [\n\n /\\b(aarch64|arm(v?[89]e?l?|_?64))\\b/i // ARM64\n ], [[ARCHITECTURE, 'arm64']], [\n\n /\\b(arm(v[67])?ht?n?[fl]p?)\\b/i // ARMHF\n ], [[ARCHITECTURE, 'armhf']], [\n\n // PocketPC mistakenly identified as PowerPC\n /( (ce|mobile); ppc;|\\/[\\w\\.]+arm\\b)/i\n ], [[ARCHITECTURE, 'arm']], [\n\n /((ppc|powerpc)(64)?)( mac|;|\\))/i // PowerPC\n ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [\n\n / sun4\\w[;\\)]/i // SPARC\n ], [[ARCHITECTURE, 'sparc']], [\n\n /\\b(avr32|ia64(?=;)|68k(?=\\))|\\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\\b|pa-risc)/i\n // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC\n ], [[ARCHITECTURE, lowerize]]\n ],\n\n device : [[\n\n //////////////////////////\n // MOBILES & TABLETS\n /////////////////////////\n\n // Samsung\n /\\b(sch-i[89]0\\d|shw-m380s|sm-[ptx]\\w{2,4}|gt-[pn]\\d{2,4}|sgh-t8[56]9|nexus 10)/i\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [\n /\\b((?:s[cgp]h|gt|sm)-(?![lr])\\w+|sc[g-]?[\\d]+a?|galaxy nexus)/i,\n /samsung[- ]((?!sm-[lr]|browser)[-\\w]+)/i,\n /sec-(sgh\\w+)/i\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [\n\n // Apple\n /(?:\\/|\\()(ip(?:hone|od)[\\w, ]*)(?:\\/|;)/i // iPod/iPhone\n ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [\n /\\((ipad);[-\\w\\),; ]+apple/i, // iPad\n /applecoremedia\\/[\\w\\.]+ \\((ipad)/i,\n /\\b(ipad)\\d\\d?,\\d\\d?[;\\]].+ios/i\n ], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [\n /(macintosh);/i\n ], [MODEL, [VENDOR, APPLE]], [\n\n // Sharp\n /\\b(sh-?[altvz]?\\d\\d[a-ekm]?)/i\n ], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [\n\n // Honor\n /\\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\\)|;)/i\n ], [MODEL, [VENDOR, HONOR], [TYPE, TABLET]], [\n /honor([-\\w ]+)[;\\)]/i\n ], [MODEL, [VENDOR, HONOR], [TYPE, MOBILE]], [\n\n // Huawei\n /\\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\\w\\. ]*(?= bui|\\)))\\b(?!.+d\\/s)/i\n ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [\n /(?:huawei)([-\\w ]+)[;\\)]/i,\n /\\b(nexus 6p|\\w{2,4}e?-[atu]?[ln][\\dx][012359c][adn]?)\\b(?!.+d\\/s)/i\n ], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [\n\n // Xiaomi\n /oid[^\\)]+; (2[\\dbc]{4}(182|283|rp\\w{2})[cgl]|m2105k81a?c)(?: bui|\\))/i,\n /\\b((?:red)?mi[-_ ]?pad[\\w- ]*)(?: bui|\\))/i // Mi Pad tablets\n ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [\n\n /\\b(poco[\\w ]+|m2\\d{3}j\\d\\d[a-z]{2})(?: bui|\\))/i, // Xiaomi POCO\n /\\b; (\\w+) build\\/hm\\1/i, // Xiaomi Hongmi 'numeric' models\n /\\b(hm[-_ ]?note?[_ ]?(?:\\d\\w)?) bui/i, // Xiaomi Hongmi\n /\\b(redmi[\\-_ ]?(?:note|k)?[\\w_ ]+)(?: bui|\\))/i, // Xiaomi Redmi\n /oid[^\\)]+; (m?[12][0-389][01]\\w{3,6}[c-y])( bui|; wv|\\))/i, // Xiaomi Redmi 'numeric' models\n /\\b(mi[-_ ]?(?:a\\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\\d?\\w?)[_ ]?(?:plus|se|lite|pro)?)(?: bui|\\))/i, // Xiaomi Mi\n / ([\\w ]+) miui\\/v?\\d/i\n ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [\n\n // OnePlus\n /droid.+; (cph2[3-6]\\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\\d|p[g-k]\\w[1m]10)\\b/i,\n /(?:one)?(?:plus)? (a\\d0\\d\\d)(?: b|\\))/i\n ], [MODEL, [VENDOR, ONEPLUS], [TYPE, MOBILE]], [\n\n // OPPO\n /; (\\w+) bui.+ oppo/i,\n /\\b(cph[12]\\d{3}|p(?:af|c[al]|d\\w|e[ar])[mt]\\d0|x9007|a101op)\\b/i\n ], [MODEL, [VENDOR, OPPO], [TYPE, MOBILE]], [\n /\\b(opd2(\\d{3}a?))(?: bui|\\))/i\n ], [MODEL, [VENDOR, strMapper, { 'OnePlus' : ['203', '304', '403', '404', '413', '415'], '*' : OPPO }], [TYPE, TABLET]], [\n\n // BLU\n /(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\\w\\+ ]*)(?: bui|\\))/i // Vivo series\n ], [MODEL, [VENDOR, 'BLU'], [TYPE, MOBILE]], [ \n\n // Vivo\n /; vivo (\\w+)(?: bui|\\))/i,\n /\\b(v[12]\\d{3}\\w?[at])(?: bui|;)/i\n ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [\n\n // Realme\n /\\b(rmx[1-3]\\d{3})(?: bui|;|\\))/i\n ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [\n\n // Lenovo\n /(ideatab[-\\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\\d{3,4}(?:f[cu]|xu|[av])|yt\\d?-[jx]?\\d+[lfmx])( bui|;|\\)|\\/)/i,\n /lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\\w- ]+?)|tb[\\w-]{6,7})( bui|;|\\)|\\/)/i\n ], [MODEL, [VENDOR, LENOVO], [TYPE, TABLET]], [ \n /lenovo[-_ ]?([-\\w ]+?)(?: bui|\\)|\\/)/i\n ], [MODEL, [VENDOR, LENOVO], [TYPE, MOBILE]], [\n\n // Motorola\n /\\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\\b[\\w ]+build\\//i,\n /\\bmot(?:orola)?[- ]([\\w\\s]+)(\\)| bui)/i,\n /((?:moto(?! 360)[-\\w\\(\\) ]+|xt\\d{3,4}[cgkosw\\+]?[-\\d]*|nexus 6)(?= bui|\\)))/i\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]], [\n /\\b(mz60\\d|xoom[2 ]{0,2}) build\\//i\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [\n\n // LG\n /((?=lg)?[vl]k\\-?\\d{3}) bui| 3\\.[-\\w; ]{10}lg?-([06cv9]{3,4})/i\n ], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [\n /(lm(?:-?f100[nv]?|-[\\w\\.]+)(?= bui|\\))|nexus [45])/i,\n /\\blg[-e;\\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\\w+)/i,\n /\\blg-?([\\d\\w]+) bui/i\n ], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [\n\n // Nokia\n /(nokia) (t[12][01])/i\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n /(?:maemo|nokia).*(n900|lumia \\d+|rm-\\d+)/i,\n /nokia[-_ ]?(([-\\w\\. ]*))/i\n ], [[MODEL, /_/g, ' '], [TYPE, MOBILE], [VENDOR, 'Nokia']], [\n\n // Google\n /(pixel (c|tablet))\\b/i // Google Pixel C/Tablet\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [\n // Google Pixel\n /droid.+;(?: google)? (g(01[13]a|020[aem]|025[jn]|1b60|1f8f|2ybb|4s1m|576d|5nz6|8hhn|8vou|a02099|c15s|d1yq|e2ae|ec77|gh2x|kv4x|p4bc|pj41|r83y|tt9q|ur25|wvk6)|pixel[\\d ]*a?( pro)?( xl)?( fold)?( \\(5g\\))?)( bui|\\))/i\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [\n /(google) (pixelbook( go)?)/i\n ], [VENDOR, MODEL], [\n\n // Sony\n /droid.+; (a?\\d[0-2]{2}so|[c-g]\\d{4}|so[-gl]\\w+|xq-\\w\\w\\d\\d)(?= bui|\\).+chrome\\/(?![1-6]{0,1}\\d\\.))/i\n ], [MODEL, [VENDOR, SONY], [TYPE, MOBILE]], [\n /sony tablet [ps]/i,\n /\\b(?:sony)?sgp\\w+(?: bui|\\))/i\n ], [[MODEL, 'Xperia Tablet'], [VENDOR, SONY], [TYPE, TABLET]], [\n\n // Amazon\n /(alexa)webm/i,\n /(kf[a-z]{2}wi|aeo(?!bc)\\w\\w)( bui|\\))/i, // Kindle Fire without Silk / Echo Show\n /(kf[a-z]+)( bui|\\)).+silk\\//i // Kindle Fire HD\n ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [\n /((?:sd|kf)[0349hijorstuw]+)( bui|\\)).+silk\\//i // Fire Phone\n ], [[MODEL, /(.+)/g, 'Fire Phone $1'], [VENDOR, AMAZON], [TYPE, MOBILE]], [\n\n // BlackBerry\n /(playbook);[-\\w\\),; ]+(rim)/i // BlackBerry PlayBook\n ], [MODEL, VENDOR, [TYPE, TABLET]], [\n /\\b((?:bb[a-f]|st[hv])100-\\d)/i,\n /\\(bb10; (\\w+)/i // BlackBerry 10\n ], [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]], [\n\n // Asus\n /(?:\\b|asus_)(transfo[prime ]{4,10} \\w+|eeepc|slider \\w+|nexus 7|padfone|p00[cj])/i\n ], [MODEL, [VENDOR, ASUS], [TYPE, TABLET]], [\n / (z[bes]6[027][012][km][ls]|zenfone \\d\\w?)\\b/i\n ], [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]], [\n\n // HTC\n /(nexus 9)/i // HTC Nexus 9\n ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [\n /(htc)[-;_ ]{1,2}([\\w ]+(?=\\)| bui)|\\w+)/i, // HTC\n\n // ZTE\n /(zte)[- ]([\\w ]+?)(?: bui|\\/|\\))/i,\n /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\\.))|sony(?!-bra))[-_ ]?([-\\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony\n ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [\n\n // TCL\n /tcl (xess p17aa)/i,\n /droid [\\w\\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\\w(\\w|\\w\\w))?(\\)| bui)/i\n ], [MODEL, [VENDOR, 'TCL'], [TYPE, TABLET]], [\n /droid [\\w\\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\\w(\\w|\\w\\w))?(\\)| bui)/i\n ], [MODEL, [VENDOR, 'TCL'], [TYPE, MOBILE]], [\n\n // itel\n /(itel) ((\\w+))/i\n ], [[VENDOR, lowerize], MODEL, [TYPE, strMapper, { 'tablet' : ['p10001l', 'w7001'], '*' : 'mobile' }]], [\n\n // Acer\n /droid.+; ([ab][1-7]-?[0178a]\\d\\d?)/i\n ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [\n\n // Meizu\n /droid.+; (m[1-5] note) bui/i,\n /\\bmz-([-\\w]{2,})/i\n ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [\n \n // Ulefone\n /; ((?:power )?armor(?:[\\w ]{0,8}))(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Ulefone'], [TYPE, MOBILE]], [\n\n // Energizer\n /; (energy ?\\w+)(?: bui|\\))/i,\n /; energizer ([\\w ]+)(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Energizer'], [TYPE, MOBILE]], [\n\n // Cat\n /; cat (b35);/i,\n /; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Cat'], [TYPE, MOBILE]], [\n\n // Smartfren\n /((?:new )?andromax[\\w- ]+)(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Smartfren'], [TYPE, MOBILE]], [\n\n // Nothing\n /droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i\n ], [MODEL, [VENDOR, 'Nothing'], [TYPE, MOBILE]], [\n\n // Archos\n /; (x67 5g|tikeasy \\w+|ac[1789]\\d\\w+)( b|\\))/i,\n /archos ?(5|gamepad2?|([\\w ]*[t1789]|hello) ?\\d+[\\w ]*)( b|\\))/i\n ], [MODEL, [VENDOR, 'Archos'], [TYPE, TABLET]], [\n /archos ([\\w ]+)( b|\\))/i,\n /; (ac[3-6]\\d\\w{2,8})( b|\\))/i \n ], [MODEL, [VENDOR, 'Archos'], [TYPE, MOBILE]], [\n\n // HMD\n /; (n159v)/i\n ], [MODEL, [VENDOR, 'HMD'], [TYPE, MOBILE]], [\n\n // MIXED\n /(imo) (tab \\w+)/i, // IMO\n /(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i // Infinix XPad / Tecno\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n /(blackberry|benq|palm(?=\\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\\w]*)/i,\n // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Tecno/Micromax/Advan\n /; (blu|hmd|imo|infinix|lava|oneplus|tcl)[_ ]([\\w\\+ ]+?)(?: bui|\\)|; r)/i, // BLU/HMD/IMO/Infinix/Lava/OnePlus/TCL\n /(hp) ([\\w ]+\\w)/i, // HP iPAQ\n /(microsoft); (lumia[\\w ]+)/i, // Microsoft Lumia\n /(oppo) ?([\\w ]+) bui/i // OPPO\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n\n /(kobo)\\s(ereader|touch)/i, // Kobo\n /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad\n /(kindle)\\/([\\w\\.]+)/i // Kindle\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n /(surface duo)/i // Surface Duo\n ], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [\n /droid [\\d\\.]+; (fp\\du?)(?: b|\\))/i // Fairphone\n ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [\n /((?:tegranote|shield t(?!.+d tv))[\\w- ]*?)(?: b|\\))/i // Nvidia Tablets\n ], [MODEL, [VENDOR, NVIDIA], [TYPE, TABLET]], [\n /(sprint) (\\w+)/i // Sprint Phones\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n /(kin\\.[onetw]{3})/i // Microsoft Kin\n ], [[MODEL, /\\./g, ' '], [VENDOR, MICROSOFT], [TYPE, MOBILE]], [\n /droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\\)/i // Zebra\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]], [\n /droid.+; (ec30|ps20|tc[2-8]\\d[kx])\\)/i\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [\n\n ///////////////////\n // SMARTTVS\n ///////////////////\n\n /smart-tv.+(samsung)/i // Samsung\n ], [VENDOR, [TYPE, SMARTTV]], [\n /hbbtv.+maple;(\\d+)/i\n ], [[MODEL, /^/, 'SmartTV'], [VENDOR, SAMSUNG], [TYPE, SMARTTV]], [\n /(vizio)(?: |.+model\\/)(\\w+-\\w+)/i, // Vizio\n /tcast.+(lg)e?. ([-\\w]+)/i // LG SmartTV\n ], [VENDOR, MODEL, [TYPE, SMARTTV]], [\n /(nux; netcast.+smarttv|lg (netcast\\.tv-201\\d|android tv))/i\n ], [[VENDOR, LG], [TYPE, SMARTTV]], [\n /(apple) ?tv/i // Apple TV\n ], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [\n /crkey.*devicetype\\/chromecast/i // Google Chromecast Third Generation\n ], [[MODEL, CHROMECAST+' Third Generation'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /crkey.*devicetype\\/([^/]*)/i // Google Chromecast with specific device type\n ], [[MODEL, /^/, 'Chromecast '], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /fuchsia.*crkey/i // Google Chromecast Nest Hub\n ], [[MODEL, CHROMECAST+' Nest Hub'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /crkey/i // Google Chromecast, Linux-based or unknown\n ], [[MODEL, CHROMECAST], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /(portaltv)/i // Facebook Portal TV\n ], [MODEL, [VENDOR, FACEBOOK], [TYPE, SMARTTV]], [\n /droid.+aft(\\w+)( bui|\\))/i // Fire TV\n ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [\n /(shield \\w+ tv)/i // Nvidia Shield TV\n ], [MODEL, [VENDOR, NVIDIA], [TYPE, SMARTTV]], [\n /\\(dtv[\\);].+(aquos)/i,\n /(aquos-tv[\\w ]+)\\)/i // Sharp\n ], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],[\n /(bravia[\\w ]+)( bui|\\))/i // Sony\n ], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [\n /(mi(tv|box)-?\\w+) bui/i // Xiaomi\n ], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [\n /Hbbtv.*(technisat) (.*);/i // TechniSAT\n ], [VENDOR, MODEL, [TYPE, SMARTTV]], [\n /\\b(roku)[\\dx]*[\\)\\/]((?:dvp-)?[\\d\\.]*)/i, // Roku\n /hbbtv\\/\\d+\\.\\d+\\.\\d+ +\\([\\w\\+ ]*; *([\\w\\d][^;]*);([^;]*)/i // HbbTV devices\n ], [[VENDOR, /.+\\/(\\w+)/, '$1', strMapper, {'LG':'lge'}], [MODEL, trim], [TYPE, SMARTTV]], [\n // SmartTV from Unidentified Vendors\n /droid.+; ([\\w- ]+) (?:android tv|smart[- ]?tv)/i\n ], [MODEL, [TYPE, SMARTTV]], [\n /\\b(android tv|smart[- ]?tv|opera tv|tv; rv:|large screen[\\w ]+safari)\\b/i\n ], [[TYPE, SMARTTV]], [\n\n ///////////////////\n // CONSOLES\n ///////////////////\n\n /(playstation \\w+)/i // Playstation\n ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [\n /\\b(xbox(?: one)?(?!; xbox))[\\); ]/i // Microsoft Xbox\n ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [\n /(ouya)/i, // Ouya\n /(nintendo) (\\w+)/i, // Nintendo\n /(retroid) (pocket ([^\\)]+))/i // Retroid Pocket\n ], [VENDOR, MODEL, [TYPE, CONSOLE]], [\n /droid.+; (shield)( bui|\\))/i // Nvidia Portable\n ], [MODEL, [VENDOR, NVIDIA], [TYPE, CONSOLE]], [\n\n ///////////////////\n // WEARABLES\n ///////////////////\n\n /\\b(sm-[lr]\\d\\d[0156][fnuw]?s?|gear live)\\b/i // Samsung Galaxy Watch\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, WEARABLE]], [\n /((pebble))app/i, // Pebble\n /(asus|google|lg|oppo) ((pixel |zen)?watch[\\w ]*)( bui|\\))/i // Asus ZenWatch / LG Watch / Pixel Watch\n ], [VENDOR, MODEL, [TYPE, WEARABLE]], [\n /(ow(?:19|20)?we?[1-3]{1,3})/i // Oppo Watch\n ], [MODEL, [VENDOR, OPPO], [TYPE, WEARABLE]], [\n /(watch)(?: ?os[,\\/]|\\d,\\d\\/)[\\d\\.]+/i // Apple Watch\n ], [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]], [\n /(opwwe\\d{3})/i // OnePlus Watch\n ], [MODEL, [VENDOR, ONEPLUS], [TYPE, WEARABLE]], [\n /(moto 360)/i // Motorola 360\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, WEARABLE]], [\n /(smartwatch 3)/i // Sony SmartWatch\n ], [MODEL, [VENDOR, SONY], [TYPE, WEARABLE]], [\n /(g watch r)/i // LG G Watch R\n ], [MODEL, [VENDOR, LG], [TYPE, WEARABLE]], [\n /droid.+; (wt63?0{2,3})\\)/i\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [\n\n ///////////////////\n // XR\n ///////////////////\n\n /droid.+; (glass) \\d/i // Google Glass\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, XR]], [\n /(pico) (4|neo3(?: link|pro)?)/i // Pico\n ], [VENDOR, MODEL, [TYPE, XR]], [\n /(quest( \\d| pro)?s?).+vr/i // Meta Quest\n ], [MODEL, [VENDOR, FACEBOOK], [TYPE, XR]], [\n /mobile vr; rv.+firefox/i // Unidentifiable VR device using Firefox Reality / Wolvic\n ], [[TYPE, XR]], [\n\n ///////////////////\n // EMBEDDED\n ///////////////////\n\n /(tesla)(?: qtcarbrowser|\\/[-\\w\\.]+)/i // Tesla\n ], [VENDOR, [TYPE, EMBEDDED]], [\n /(aeobc)\\b/i // Echo Dot\n ], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [\n /(homepod).+mac os/i // Apple HomePod\n ], [MODEL, [VENDOR, APPLE], [TYPE, EMBEDDED]], [\n /windows iot/i // Unidentifiable embedded device using Windows IoT\n ], [[TYPE, EMBEDDED]], [\n\n ////////////////////\n // MIXED (GENERIC)\n ///////////////////\n\n /droid .+?; ([^;]+?)(?: bui|; wv\\)|\\) applew).+?(mobile|vr|\\d) safari/i\n ], [MODEL, [TYPE, strMapper, { 'mobile' : 'Mobile', 'xr' : 'VR', '*' : TABLET }]], [\n /\\b((tablet|tab)[;\\/]|focus\\/\\d(?!.+mobile))/i // Unidentifiable Tablet\n ], [[TYPE, TABLET]], [\n /(phone|mobile(?:[;\\/]| [ \\w\\/\\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile\n ], [[TYPE, MOBILE]], [\n /droid .+?; ([\\w\\. -]+)( bui|\\))/i // Generic Android Device\n ], [MODEL, [VENDOR, 'Generic']]\n ],\n\n engine : [[\n\n /windows.+ edge\\/([\\w\\.]+)/i // EdgeHTML\n ], [VERSION, [NAME, EDGE+'HTML']], [\n\n /(arkweb)\\/([\\w\\.]+)/i // ArkWeb\n ], [NAME, VERSION], [\n\n /webkit\\/537\\.36.+chrome\\/(?!27)([\\w\\.]+)/i // Blink\n ], [VERSION, [NAME, 'Blink']], [\n\n /(presto)\\/([\\w\\.]+)/i, // Presto\n /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\\/([\\w\\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna/Servo\n /ekioh(flow)\\/([\\w\\.]+)/i, // Flow\n /(khtml|tasman|links)[\\/ ]\\(?([\\w\\.]+)/i, // KHTML/Tasman/Links\n /(icab)[\\/ ]([23]\\.[\\d\\.]+)/i, // iCab\n\n /\\b(libweb)/i // LibWeb\n ], [NAME, VERSION], [\n /ladybird\\//i\n ], [[NAME, 'LibWeb']], [\n\n /rv\\:([\\w\\.]{1,9})\\b.+(gecko)/i // Gecko\n ], [VERSION, NAME]\n ],\n\n os : [[\n\n // Windows\n /(windows nt) (6\\.[23]); arm/i // Windows RT\n ], [[NAME, /N/, 'R'], [VERSION, strMapper, windowsVersionMap]], [\n /(windows (?:phone|mobile|iot))(?: os)?[\\/ ]?([\\d\\.]*( se)?)/i, // Windows IoT/Mobile/Phone\n // Windows NT/3.1/95/98/ME/2000/XP/Vista/7/8/8.1/10/11\n /(windows)[\\/ ](1[01]|2000|3\\.1|7|8(\\.1)?|9[58]|me|server 20\\d\\d( r2)?|vista|xp)/i\n ], [NAME, VERSION], [\n /windows nt ?([\\d\\.\\)]*)(?!.+xbox)/i,\n /\\bwin(?=3| ?9|n)(?:nt| 9x )?([\\d\\.;]*)/i\n ], [[VERSION, /(;|\\))/g, '', strMapper, windowsVersionMap], [NAME, WINDOWS]], [\n /(windows ce)\\/?([\\d\\.]*)/i // Windows CE\n ], [NAME, VERSION], [\n\n // iOS/macOS\n /[adehimnop]{4,7}\\b(?:.*os ([\\w]+) like mac|; opera)/i, // iOS\n /(?:ios;fbsv\\/|iphone.+ios[\\/ ])([\\d\\.]+)/i,\n /cfnetwork\\/.+darwin/i\n ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [\n /(mac os x) ?([\\w\\. ]*)/i,\n /(macintosh|mac_powerpc\\b)(?!.+(haiku|morphos))/i // Mac OS\n ], [[NAME, 'macOS'], [VERSION, /_/g, '.']], [\n\n // Google Chromecast\n /android ([\\d\\.]+).*crkey/i // Google Chromecast, Android-based\n ], [VERSION, [NAME, CHROMECAST + ' Android']], [\n /fuchsia.*crkey\\/([\\d\\.]+)/i // Google Chromecast, Fuchsia-based\n ], [VERSION, [NAME, CHROMECAST + ' Fuchsia']], [\n /crkey\\/([\\d\\.]+).*devicetype\\/smartspeaker/i // Google Chromecast, Linux-based Smart Speaker\n ], [VERSION, [NAME, CHROMECAST + ' SmartSpeaker']], [\n /linux.*crkey\\/([\\d\\.]+)/i // Google Chromecast, Legacy Linux-based\n ], [VERSION, [NAME, CHROMECAST + ' Linux']], [\n /crkey\\/([\\d\\.]+)/i // Google Chromecast, unknown\n ], [VERSION, [NAME, CHROMECAST]], [\n\n // Mobile OSes\n /droid ([\\w\\.]+)\\b.+(android[- ]x86)/i // Android-x86\n ], [VERSION, NAME], [ \n /(ubuntu) ([\\w\\.]+) like android/i // Ubuntu Touch\n ], [[NAME, /(.+)/, '$1 Touch'], VERSION], [\n /(harmonyos)[\\/ ]?([\\d\\.]*)/i, // HarmonyOS\n // Android/Blackberry/WebOS/QNX/Bada/RIM/KaiOS/Maemo/MeeGo/S40/Sailfish OS/OpenHarmony/Tizen\n /(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\\w*[-\\/\\.; ]?([\\d\\.]*)/i\n ], [NAME, VERSION], [\n /\\(bb(10);/i // BlackBerry 10\n ], [VERSION, [NAME, BLACKBERRY]], [\n /(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\\/ ]?([\\w\\.]*)/i // Symbian\n ], [VERSION, [NAME, 'Symbian']], [\n /mozilla\\/[\\d\\.]+ \\((?:mobile|tablet|tv|mobile; [\\w ]+); rv:.+ gecko\\/([\\w\\.]+)/i // Firefox OS\n ], [VERSION, [NAME, FIREFOX+' OS']], [\n /\\b(?:hp)?wos(?:browser)?\\/([\\w\\.]+)/i, // WebOS\n /webos(?:[ \\/]?|\\.tv-20(?=2[2-9]))(\\d[\\d\\.]*)/i\n ], [VERSION, [NAME, 'webOS']], [\n /web0s;.+?(?:chr[o0]me|safari)\\/(\\d+)/i\n // https://webostv.developer.lge.com/develop/specifications/web-api-and-web-engine\n ], [[VERSION, strMapper, {'25':'120','24':'108','23':'94','22':'87','6':'79','5':'68','4':'53','3':'38','2':'538','1':'537','*':'TV'}], [NAME, 'webOS']], [ \n /watch(?: ?os[,\\/]|\\d,\\d\\/)([\\d\\.]+)/i // watchOS\n ], [VERSION, [NAME, 'watchOS']], [\n\n // Google ChromeOS\n /(cros) [\\w]+(?:\\)| ([\\w\\.]+)\\b)/i // Chromium OS\n ], [[NAME, \"Chrome OS\"], VERSION],[\n\n // Smart TVs\n /panasonic;(viera)/i, // Panasonic Viera\n /(netrange)mmh/i, // Netrange\n /(nettv)\\/(\\d+\\.[\\w\\.]+)/i, // NetTV\n\n // Console\n /(nintendo|playstation) (\\w+)/i, // Nintendo/Playstation\n /(xbox); +xbox ([^\\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)\n /(pico) .+os([\\w\\.]+)/i, // Pico\n\n // Other\n /\\b(joli|palm)\\b ?(?:os)?\\/?([\\w\\.]*)/i, // Joli/Palm\n /linux.+(mint)[\\/\\(\\) ]?([\\w\\.]*)/i, // Mint\n /(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\\d\\.]*)/i, // Mageia/VectorLinux/Fuchsia/ArcaOS/Arch\n /([kxln]?ubuntu|debian|suse|opensuse|gentoo|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire|knoppix)(?: gnu[\\/ ]linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\\/ ]?(?!chrom|package)([-\\w\\.]*)/i,\n // Ubuntu/Debian/SUSE/Gentoo/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire/Knoppix\n /((?:open)?solaris)[-\\/ ]?([\\w\\.]*)/i, // Solaris\n /\\b(aix)[; ]([1-9\\.]{0,4})/i, // AIX\n /(hurd|linux|morphos)(?: (?:arm|x86|ppc)\\w*| ?)([\\w\\.]*)/i, // Hurd/Linux/MorphOS\n /(gnu) ?([\\w\\.]*)/i, // GNU\n /\\b([-frentopcghs]{0,5}bsd|dragonfly)[\\/ ]?(?!amd|[ix346]{1,2}86)([\\w\\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly\n /(haiku) ?(r\\d)?/i // Haiku\n ], [NAME, VERSION], [\n /(sunos) ?([\\d\\.]*)/i // Solaris\n ], [[NAME, 'Solaris'], VERSION], [\n /\\b(beos|os\\/2|amigaos|openvms|hp-ux|serenityos)/i, // BeOS/OS2/AmigaOS/OpenVMS/HP-UX/SerenityOS\n /(unix) ?([\\w\\.]*)/i // UNIX\n ], [NAME, VERSION]\n ]\n };\n\n /////////////////\n // Factories\n ////////////////\n\n var defaultProps = (function () {\n var props = { init : {}, isIgnore : {}, isIgnoreRgx : {}, toString : {}};\n setProps.call(props.init, [\n [UA_BROWSER, [NAME, VERSION, MAJOR, TYPE]],\n [UA_CPU, [ARCHITECTURE]],\n [UA_DEVICE, [TYPE, MODEL, VENDOR]],\n [UA_ENGINE, [NAME, VERSION]],\n [UA_OS, [NAME, VERSION]]\n ]);\n setProps.call(props.isIgnore, [\n [UA_BROWSER, [VERSION, MAJOR]],\n [UA_ENGINE, [VERSION]],\n [UA_OS, [VERSION]]\n ]);\n setProps.call(props.isIgnoreRgx, [\n [UA_BROWSER, / ?browser$/i],\n [UA_OS, / ?os$/i]\n ]);\n setProps.call(props.toString, [\n [UA_BROWSER, [NAME, VERSION]],\n [UA_CPU, [ARCHITECTURE]],\n [UA_DEVICE, [VENDOR, MODEL]],\n [UA_ENGINE, [NAME, VERSION]],\n [UA_OS, [NAME, VERSION]]\n ]);\n return props;\n })();\n\n var createIData = function (item, itemType) {\n\n var init_props = defaultProps.init[itemType],\n is_ignoreProps = defaultProps.isIgnore[itemType] || 0,\n is_ignoreRgx = defaultProps.isIgnoreRgx[itemType] || 0,\n toString_props = defaultProps.toString[itemType] || 0;\n\n function IData () {\n setProps.call(this, init_props);\n }\n\n IData.prototype.getItem = function () {\n return item;\n };\n\n IData.prototype.withClientHints = function () {\n\n // nodejs / non-client-hints browsers\n if (!NAVIGATOR_UADATA) {\n return item\n .parseCH()\n .get();\n }\n\n // browsers based on chromium 85+\n return NAVIGATOR_UADATA\n .getHighEntropyValues(CH_ALL_VALUES)\n .then(function (res) {\n return item\n .setCH(new UACHData(res, false))\n .parseCH()\n .get();\n });\n };\n\n IData.prototype.withFeatureCheck = function () {\n return item.detectFeature().get();\n };\n\n if (itemType != UA_RESULT) {\n IData.prototype.is = function (strToCheck) {\n var is = false;\n for (var i in this) {\n if (this.hasOwnProperty(i) && !has(is_ignoreProps, i) && lowerize(is_ignoreRgx ? strip(is_ignoreRgx, this[i]) : this[i]) == lowerize(is_ignoreRgx ? strip(is_ignoreRgx, strToCheck) : strToCheck)) {\n is = true;\n if (strToCheck != UNDEF_TYPE) break;\n } else if (strToCheck == UNDEF_TYPE && is) {\n is = !is;\n break;\n }\n }\n return is;\n };\n IData.prototype.toString = function () {\n var str = EMPTY;\n for (var i in toString_props) {\n if (typeof(this[toString_props[i]]) !== UNDEF_TYPE) {\n str += (str ? ' ' : EMPTY) + this[toString_props[i]];\n }\n }\n return str || UNDEF_TYPE;\n };\n }\n\n if (!NAVIGATOR_UADATA) {\n IData.prototype.then = function (cb) { \n var that = this;\n var IDataResolve = function () {\n for (var prop in that) {\n if (that.hasOwnProperty(prop)) {\n this[prop] = that[prop];\n }\n }\n };\n IDataResolve.prototype = {\n is : IData.prototype.is,\n toString : IData.prototype.toString\n };\n var resolveData = new IDataResolve();\n cb(resolveData);\n return resolveData;\n };\n }\n\n return new IData();\n };\n\n /////////////////\n // Constructor\n ////////////////\n\n function UACHData (uach, isHttpUACH) {\n uach = uach || {};\n setProps.call(this, CH_ALL_VALUES);\n if (isHttpUACH) {\n setProps.call(this, [\n [BRANDS, itemListToArray(uach[CH_HEADER])],\n [FULLVERLIST, itemListToArray(uach[CH_HEADER_FULL_VER_LIST])],\n [MOBILE, /\\?1/.test(uach[CH_HEADER_MOBILE])],\n [MODEL, stripQuotes(uach[CH_HEADER_MODEL])],\n [PLATFORM, stripQuotes(uach[CH_HEADER_PLATFORM])],\n [PLATFORMVER, stripQuotes(uach[CH_HEADER_PLATFORM_VER])],\n [ARCHITECTURE, stripQuotes(uach[CH_HEADER_ARCH])],\n [FORMFACTORS, itemListToArray(uach[CH_HEADER_FORM_FACTORS])],\n [BITNESS, stripQuotes(uach[CH_HEADER_BITNESS])]\n ]);\n } else {\n for (var prop in uach) {\n if(this.hasOwnProperty(prop) && typeof uach[prop] !== UNDEF_TYPE) this[prop] = uach[prop];\n }\n }\n }\n\n function UAItem (itemType, ua, rgxMap, uaCH) {\n\n this.get = function (prop) {\n if (!prop) return this.data;\n return this.data.hasOwnProperty(prop) ? this.data[prop] : undefined;\n };\n\n this.set = function (prop, val) {\n this.data[prop] = val;\n return this;\n };\n\n this.setCH = function (ch) {\n this.uaCH = ch;\n return this;\n };\n\n this.detectFeature = function () {\n if (NAVIGATOR && NAVIGATOR.userAgent == this.ua) {\n switch (this.itemType) {\n case UA_BROWSER:\n // Brave-specific detection\n if (NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == FUNC_TYPE) {\n this.set(NAME, 'Brave');\n }\n break;\n case UA_DEVICE:\n // Chrome-specific detection: check for 'mobile' value of navigator.userAgentData\n if (!this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) {\n this.set(TYPE, MOBILE);\n }\n // iPadOS-specific detection: identified as Mac, but has some iOS-only properties\n if (this.get(MODEL) == 'Macintosh' && NAVIGATOR && typeof NAVIGATOR.standalone !== UNDEF_TYPE && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 2) {\n this.set(MODEL, 'iPad')\n .set(TYPE, TABLET);\n }\n break;\n case UA_OS:\n // Chrome-specific detection: check for 'platform' value of navigator.userAgentData\n if (!this.get(NAME) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[PLATFORM]) {\n this.set(NAME, NAVIGATOR_UADATA[PLATFORM]);\n }\n break;\n case UA_RESULT:\n var data = this.data;\n var detect = function (itemType) {\n return data[itemType]\n .getItem()\n .detectFeature()\n .get();\n };\n this.set(UA_BROWSER, detect(UA_BROWSER))\n .set(UA_CPU, detect(UA_CPU))\n .set(UA_DEVICE, detect(UA_DEVICE))\n .set(UA_ENGINE, detect(UA_ENGINE))\n .set(UA_OS, detect(UA_OS));\n }\n }\n return this;\n };\n\n this.parseUA = function () {\n if (this.itemType != UA_RESULT) {\n rgxMapper.call(this.data, this.ua, this.rgxMap);\n }\n if (this.itemType == UA_BROWSER) {\n this.set(MAJOR, majorize(this.get(VERSION)));\n }\n return this;\n };\n\n this.parseCH = function () {\n var uaCH = this.uaCH,\n rgxMap = this.rgxMap;\n \n switch (this.itemType) {\n case UA_BROWSER:\n case UA_ENGINE:\n var brands = uaCH[FULLVERLIST] || uaCH[BRANDS], prevName;\n if (brands) {\n for (var i in brands) {\n var brandName = brands[i].brand || brands[i],\n brandVersion = brands[i].version;\n if (this.itemType == UA_BROWSER && \n !/not.a.brand/i.test(brandName) && \n (!prevName || \n (/Chrom/.test(prevName) && brandName != CHROMIUM) || \n (prevName == EDGE && /WebView2/.test(brandName))\n )) {\n brandName = strMapper(brandName, browserHintsMap);\n prevName = this.get(NAME);\n if (!(prevName && !/Chrom/.test(prevName) && /Chrom/.test(brandName))) {\n this.set(NAME, brandName)\n .set(VERSION, brandVersion)\n .set(MAJOR, majorize(brandVersion));\n }\n prevName = brandName;\n }\n if (this.itemType == UA_ENGINE && brandName == CHROMIUM) {\n this.set(VERSION, brandVersion);\n }\n }\n }\n break;\n case UA_CPU:\n var archName = uaCH[ARCHITECTURE];\n if (archName) {\n if (archName && uaCH[BITNESS] == '64') archName += '64';\n rgxMapper.call(this.data, archName + ';', rgxMap);\n }\n break;\n case UA_DEVICE:\n if (uaCH[MOBILE]) {\n this.set(TYPE, MOBILE);\n }\n if (uaCH[MODEL]) {\n this.set(MODEL, uaCH[MODEL]);\n if (!this.get(TYPE) || !this.get(VENDOR)) {\n var reParse = {};\n rgxMapper.call(reParse, 'droid 9; ' + uaCH[MODEL] + ')', rgxMap);\n if (!this.get(TYPE) && !!reParse.type) {\n this.set(TYPE, reParse.type);\n }\n if (!this.get(VENDOR) && !!reParse.vendor) {\n this.set(VENDOR, reParse.vendor);\n }\n }\n }\n if (uaCH[FORMFACTORS]) {\n var ff;\n if (typeof uaCH[FORMFACTORS] !== 'string') {\n var idx = 0;\n while (!ff && idx < uaCH[FORMFACTORS].length) {\n ff = strMapper(uaCH[FORMFACTORS][idx++], formFactorsMap);\n }\n } else {\n ff = strMapper(uaCH[FORMFACTORS], formFactorsMap);\n }\n this.set(TYPE, ff);\n }\n break;\n case UA_OS:\n var osName = uaCH[PLATFORM];\n if(osName) {\n var osVersion = uaCH[PLATFORMVER];\n if (osName == WINDOWS) osVersion = (parseInt(majorize(osVersion), 10) >= 13 ? '11' : '10');\n this.set(NAME, osName)\n .set(VERSION, osVersion);\n }\n // Xbox-Specific Detection\n if (this.get(NAME) == WINDOWS && uaCH[MODEL] == 'Xbox') {\n this.set(NAME, 'Xbox')\n .set(VERSION, undefined);\n } \n break;\n case UA_RESULT:\n var data = this.data;\n var parse = function (itemType) {\n return data[itemType]\n .getItem()\n .setCH(uaCH)\n .parseCH()\n .get();\n };\n this.set(UA_BROWSER, parse(UA_BROWSER))\n .set(UA_CPU, parse(UA_CPU))\n .set(UA_DEVICE, parse(UA_DEVICE))\n .set(UA_ENGINE, parse(UA_ENGINE))\n .set(UA_OS, parse(UA_OS));\n }\n return this;\n };\n\n setProps.call(this, [\n ['itemType', itemType],\n ['ua', ua],\n ['uaCH', uaCH],\n ['rgxMap', rgxMap],\n ['data', createIData(this, itemType)]\n ]);\n\n return this;\n }\n\n function UAParser (ua, extensions, headers) {\n\n if (typeof ua === OBJ_TYPE) {\n if (isExtensions(ua, true)) {\n if (typeof extensions === OBJ_TYPE) {\n headers = extensions; // case UAParser(extensions, headers) \n }\n extensions = ua; // case UAParser(extensions)\n } else {\n headers = ua; // case UAParser(headers)\n extensions = undefined;\n }\n ua = undefined;\n } else if (typeof ua === STR_TYPE && !isExtensions(extensions, true)) {\n headers = extensions; // case UAParser(ua, headers)\n extensions = undefined;\n }\n\n // Convert Headers object into a plain object\n if (headers && typeof headers.append === FUNC_TYPE) {\n var kv = {};\n headers.forEach(function (v, k) { kv[k] = v; });\n headers = kv;\n }\n \n if (!(this instanceof UAParser)) {\n return new UAParser(ua, extensions, headers).getResult();\n }\n\n var userAgent = typeof ua === STR_TYPE ? ua : // Passed user-agent string\n (headers && headers[USER_AGENT] ? headers[USER_AGENT] : // User-Agent from passed headers\n ((NAVIGATOR && NAVIGATOR.userAgent) ? NAVIGATOR.userAgent : // navigator.userAgent\n EMPTY)), // empty string\n\n httpUACH = new UACHData(headers, true),\n regexMap = extensions ? \n extend(defaultRegexes, extensions) : \n defaultRegexes,\n\n createItemFunc = function (itemType) {\n if (itemType == UA_RESULT) {\n return function () {\n return new UAItem(itemType, userAgent, regexMap, httpUACH)\n .set('ua', userAgent)\n .set(UA_BROWSER, this.getBrowser())\n .set(UA_CPU, this.getCPU())\n .set(UA_DEVICE, this.getDevice())\n .set(UA_ENGINE, this.getEngine())\n .set(UA_OS, this.getOS())\n .get();\n };\n } else {\n return function () {\n return new UAItem(itemType, userAgent, regexMap[itemType], httpUACH)\n .parseUA()\n .get();\n };\n }\n };\n \n // public methods\n setProps.call(this, [\n ['getBrowser', createItemFunc(UA_BROWSER)],\n ['getCPU', createItemFunc(UA_CPU)],\n ['getDevice', createItemFunc(UA_DEVICE)],\n ['getEngine', createItemFunc(UA_ENGINE)],\n ['getOS', createItemFunc(UA_OS)],\n ['getResult', createItemFunc(UA_RESULT)],\n ['getUA', function () { return userAgent; }],\n ['setUA', function (ua) {\n if (isString(ua))\n userAgent = ua.length > UA_MAX_LENGTH ? trim(ua, UA_MAX_LENGTH) : ua;\n return this;\n }]\n ])\n .setUA(userAgent);\n\n return this;\n }\n\n UAParser.VERSION = LIBVERSION;\n UAParser.BROWSER = enumerize([NAME, VERSION, MAJOR, TYPE]);\n UAParser.CPU = enumerize([ARCHITECTURE]);\n UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);\n UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);\n\n export {UAParser};","import { UAParser } from \"ua-parser-js\";\nimport { DeviceOs } from \"../../core\";\n\nexport const getOs = async (): Promise<DeviceOs> => {\n const parser = new UAParser(navigator.userAgent);\n const result = parser.getResult();\n return { ...result.os, device_type: getDeviceType() };\n};\n\nconst getDeviceType = () => {\n const w = window.innerWidth;\n if (w <= 767) return 'mobile';\n if (w <= 1024) return 'tablet';\n return 'desktop';\n};\n","import {\n ALLOWED_DEVICE_TYPES,\n ALLOWED_OS,\n AllowedOs,\n DeviceType,\n} from '../../../core';\n\n// Normalize the gueesed Os\nexport const normalizeOs = (\n platform: string | undefined | null\n): AllowedOs | null => {\n if (!platform) return null;\n const lowerPlatform = platform.toLowerCase();\n\n if (lowerPlatform.includes(\"android\")) return \"android\";\n if (\n lowerPlatform.includes(\"iphone\") ||\n lowerPlatform.includes(\"ipad\") ||\n lowerPlatform === \"ios\"\n )\n return \"ios\";\n if (lowerPlatform.includes(\"win\")) return \"windows\";\n if (lowerPlatform.includes(\"mac\") || lowerPlatform.includes(\"macos\"))\n return \"macos\";\n if (lowerPlatform.includes(\"linux\")) return \"linux\";\n // if (lowerPlatform.includes(\"cros\")) return \"linux\"; // Example extension\n\n return null;\n};\n\nconst patterns = {\n ios: [/apple a\\d+ gpu/i],\n macos: [/apple m\\d+/i, /opengl engine/i],\n windows: [/angle.*direct3d/i],\n android: [/adreno|mali|powervr/i],\n linux: [/mesa|x11/i],\n};\n\n// Detect the actual OS from the GPU vendor and renderer if available\nexport const detectActualOs = (renderer: string): AllowedOs | null => {\n if (patterns.ios.some((pattern) => pattern.test(renderer))) {\n return \"ios\";\n } else if (patterns.macos.some((pattern) => pattern.test(renderer))) {\n return \"macos\";\n } else if (patterns.windows.some((pattern) => pattern.test(renderer))) {\n return \"windows\";\n } else if (patterns.android.some((pattern) => pattern.test(renderer))) {\n return \"android\";\n } else if (\n patterns.linux.some((pattern) => pattern.test(renderer)) ||\n /NVIDIA|AMD|Intel/i.test(renderer)\n ) {\n return \"linux\";\n } else {\n return null;\n }\n};\n\nexport const determineDeviceType = (\n claimedMobile: boolean | null,\n hasTouch: boolean,\n screenWidth: number,\n realOs: AllowedOs | null\n): DeviceType | null => {\n // Determine the real device type from the os\n if (realOs === \"ios\" || realOs === \"android\") {\n return screenWidth > 768 ? \"tablet\" : \"mobile\";\n }\n\n if (realOs === \"windows\" || realOs === \"macos\" || realOs === \"linux\") {\n return \"desktop\";\n }\n\n // check using touch attributes if the os couldn't determine device type\n if (hasTouch) {\n if (screenWidth < 600) return \"mobile\";\n if (screenWidth <= 1024) return \"tablet\";\n if (claimedMobile === false) return \"desktop\"; // Likely touch laptop\n return \"tablet\"; // Default large touch to tablet\n }\n\n if (!hasTouch) {\n return \"desktop\";\n }\n\n return null;\n};\n\nexport const guessDeviceTypeFromUA = (ua: string): DeviceType | null => {\n const lowerUa = ua.toLowerCase();\n if (/(tablet|ipad|playbook|silk)|(android(?!.*mobi))/i.test(lowerUa)) {\n return \"tablet\";\n }\n if (\n /Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Kindle|Silk-Accelerated|hpwos|Opera M(obi|ini)/i.test(\n lowerUa\n )\n ) {\n return \"mobile\";\n }\n if (\n lowerUa.includes(\"windows nt\") ||\n lowerUa.includes(\"macintosh\") ||\n lowerUa.includes(\"x11\")\n ) {\n return \"desktop\";\n }\n return null;\n};\n\nexport const convertToTwoDP = (num: number): number => {\n return parseFloat(num.toFixed(2));\n};\n\nexport const isAllowedOs = (os: string): os is AllowedOs => {\n return !!os && (ALLOWED_OS as readonly string[]).includes(os);\n};\n\nexport const isAllowedDeviceType = (\n type: DeviceType | null\n): type is DeviceType => {\n return !!type && (ALLOWED_DEVICE_TYPES as readonly string[]).includes(type);\n};\n","import { DeviceResults, AllowedOs, DeviceType } from '../../../core';\nimport { normalizeOs, determineDeviceType, convertToTwoDP, isAllowedDeviceType, detectActualOs } from './helpers';\n\ntype ClaimedData = DeviceResults['claimed'];\ntype SignalData = DeviceResults['signals'];\ntype AnalysisData = DeviceResults['analysis'];\n\nexport const analyzeSpoofing = (claimed: ClaimedData, signals: SignalData): AnalysisData => {\n const MAX_CONFIDENCE_SCORE = 1.0;\n let score = MAX_CONFIDENCE_SCORE;\n const conflicts: string[] = [];\n const analysis: AnalysisData = {\n confidence: MAX_CONFIDENCE_SCORE,\n spoofingConfidence: 0.0,\n isSpoofed: false,\n detectionConflicts: [],\n realPlatform: null,\n realDeviceType: null,\n };\n\n const hasTouch = signals.touchPoints > 0;\n const screenWidth = signals.screen.width;\n\n const claimedOs = normalizeOs(claimed.platform);\n const gpuOs = detectActualOs(signals.webGL.renderer?.toLowerCase() || '');\n const platformOs = normalizeOs(signals.actualPlatform);\n const actualOs = gpuOs || platformOs;\n let suspectedOs: AllowedOs | null = claimedOs;\n\n // --- Apply Rules ---\n\n // Rule 1: Os Mismatch\n if (claimedOs && actualOs && claimedOs !== actualOs) {\n score -= 0.3;\n conflicts.push(`Claimed OS \"${claimedOs}\" disagrees with actual OS signal \"${actualOs}\".`);\n suspectedOs = actualOs; // Trust actual signal more initially\n } else if (claimedOs && !actualOs && claimed.platform !== '') {\n score -= 0.2;\n conflicts.push(`Actual OS signal \"${signals.actualPlatform}\" is unrecognized.`);\n suspectedOs = claimedOs;\n } else if (!claimedOs && actualOs) {\n score -= 0.2;\n conflicts.push(`Claimed OS signal \"${claimed.platform}\" is unrecognized.`);\n suspectedOs = actualOs;\n }\n\n // Rule 2: GPU Vendor vs Determined Preliminary OS\n const gpuVendor = (signals.webGL.vendor || \"\").toLowerCase();\n const gpuRenderer = (signals.webGL.renderer || \"\").toLowerCase();\n\n if (gpuVendor && gpuVendor !== 'n/a' && gpuVendor !== 'n/a (masked)') {\n let gpuConflict = false;\n let gpuSuggestedOs: AllowedOs | null = null;\n\n if (suspectedOs === 'android' && (gpuVendor.includes('apple') || gpuRenderer.includes('apple'))) { gpuConflict = true; gpuSuggestedOs = 'ios'; }\n else if (suspectedOs === 'ios' && !gpuVendor.includes('apple') && !gpuRenderer.includes('apple')) {\n gpuConflict = true;\n if (gpuVendor.includes('qualcomm') || gpuVendor.includes('adreno') || gpuVendor.includes('mali') || gpuVendor.includes('powervr') || gpuVendor.includes('arm')) { gpuSuggestedOs = 'android'; }\n else if (gpuVendor.includes('intel') || gpuRenderer.includes('intel') || gpuVendor.includes('nvidia') || gpuRenderer.includes('nvidia') || gpuVendor.includes('amd') || gpuRenderer.includes('amd') || gpuRenderer.includes('radeon')) { gpuSuggestedOs = 'windows'; }\n else { gpuSuggestedOs = 'android'; }\n }\n else if (suspectedOs === 'windows' && (gpuVendor.includes('apple') || gpuRenderer.includes('apple'))) { gpuConflict = true; gpuSuggestedOs = 'macos'; }\n else if (suspectedOs === 'macos' && !(gpuVendor.includes('apple') || gpuRenderer.includes('apple') || gpuVendor.includes('intel') || gpuRenderer.includes('intel') || gpuVendor.includes('amd') || gpuRenderer.includes('amd') || gpuRenderer.includes('radeon'))) {\n gpuConflict = true;\n if (gpuVendor.includes('qualcomm') || gpuVendor.includes('adreno') || gpuVendor.includes('mali') || gpuVendor.includes('powervr') || gpuVendor.includes('arm')) { gpuSuggestedOs = 'android'; }\n else { gpuSuggestedOs = 'windows'; }\n }\n\n if (gpuConflict) {\n score -= 0.5;\n conflicts.push(`OS \"${suspectedOs}\" conflicts with GPU \"${signals.webGL.vendor} / ${signals.webGL.renderer}\". GPU suggests \"${gpuSuggestedOs || 'unknown'}\".`);\n if (gpuSuggestedOs) { suspectedOs = gpuSuggestedOs; }\n }\n // Add logic here for suspicious but not conflicting GPUs if desired (e.g., Intel GPU on Android)\n } else if (signals.webGL.error) {\n score -= 0.1;\n conflicts.push(`WebGL info unavailable (${signals.webGL.error}).`);\n }\n\n\n // Rule 3: Claimed Device Type vs Touch Support\n let preliminaryRealDeviceType: DeviceType | null = null;\n const normalizedClaimedType = isAllowedDeviceType(claimed.guessedDeviceType) ? claimed.guessedDeviceType : null;\n\n if (claimed.mobile === true && !hasTouch) {\n score -= 0.3;\n conflicts.push(`Claimed mobile=true but no touch points detected.`);\n preliminaryRealDeviceType = 'desktop';\n } else if (claimed.mobile === false && hasTouch) {\n score -= 0.15;\n conflicts.push(`Claimed mobile=false but touch points detected.`);\n preliminaryRealDeviceType = determineDeviceType(claimed.mobile, hasTouch, screenWidth, suspectedOs);\n } else if (normalizedClaimedType) {\n // If claimed type exists and doesn't conflict strongly with touch, use it as preliminary\n preliminaryRealDeviceType = normalizedClaimedType;\n }\n\n\n // Rule 4: Screen Size vs Preliminary Device Type Sanity Check\n const typicalMobileWidth = 768;\n const typicalTabletWidth = 1024;\n\n if (preliminaryRealDeviceType === 'mobile' && screenWidth > typicalTabletWidth) {\n score -= 0.15;\n conflicts.push(`Device type 'mobile', but screen width (${screenWidth}px) is large.`);\n preliminaryRealDeviceType = 'tablet';\n } else if (preliminaryRealDeviceType === 'desktop' && screenWidth < typicalMobileWidth) {\n score -= 0.15;\n conflicts.push(`Preliminary type 'desktop', but screen width (${screenWidth}px) is small.`);\n preliminaryRealDeviceType = hasTouch ? 'mobile' : 'desktop';\n }\n\n // --- Finalize Analysis ---\n // We use the suspected Os but fallback to the claimed os of the ua if null\n analysis.realPlatform = suspectedOs || claimedOs;\n\n // Determine final device type\n const determinedType = determineDeviceType(claimed.mobile, hasTouch, screenWidth, analysis.realPlatform);\n\n if (!preliminaryRealDeviceType) {\n analysis.realDeviceType = determinedType;\n } else {\n // Check if the determined type based on final signals contradicts the preliminary one\n if (determinedType && determinedType !== preliminaryRealDeviceType) {\n score -= 0.12; // Small penalty for internal inconsistency\n conflicts.push(`Initial device type guess (${preliminaryRealDeviceType}) adjusted to ${determinedType} based on final signals.`);\n analysis.realDeviceType = determinedType;\n } else {\n analysis.realDeviceType = preliminaryRealDeviceType;\n }\n }\n\n // Ensure device type is populated based on OS if still null\n if (!analysis.realDeviceType) {\n if (analysis.realPlatform === 'ios' || analysis.realPlatform === 'android') {\n analysis.realDeviceType = determinedType || 'mobile';\n } else if (analysis.realPlatform) { // windows, macos, linux\n analysis.realDeviceType = determinedType || 'desktop';\n } else { // OS unknown\n analysis.realDeviceType = hasTouch ? (screenWidth > 768 ? 'tablet' : 'mobile') : 'desktop';\n }\n }\n\n analysis.confidence = convertToTwoDP(Math.max(0, score));\n analysis.spoofingConfidence = convertToTwoDP(MAX_CONFIDENCE_SCORE - analysis.confidence);\n analysis.isSpoofed = analysis.spoofingConfidence > 0.1;\n analysis.detectionConflicts = conflicts;\n\n return analysis;\n};","import {\n RefinedDeviceResults,\n deviceTampering,\n DeviceResults,\n} from \"../../../core\";\nimport { analyzeSpoofing } from \"./analyze-data\";\nimport { getClaimedData, getSignalData } from \"./gather-data\";\n\nexport const getDeviceDetails = async (): Promise<RefinedDeviceResults> => {\n // 1. Initialize structure\n const initialResults: DeviceResults = {\n claimed: {\n platform: \"\",\n mobile: false,\n brands: [],\n guessedDeviceType: null,\n },\n signals: {\n actualPlatform: \"\",\n touchPoints: 0,\n screen: { width: 0, height: 0, pixelRatio: 1 },\n webGL: { vendor: undefined, renderer: undefined, error: \"\" },\n userAgentString: \"\",\n },\n analysis: {\n confidence: 1.0,\n spoofingConfidence: 0.0,\n isSpoofed: false,\n detectionConflicts: [],\n realPlatform: null,\n realDeviceType: null,\n },\n };\n\n // 2. Gather Signals (Sync first)\n const signals = getSignalData();\n initialResults.signals = signals;\n\n // 3. Gather Claimed Data (Async) - Pass UA string from signals\n const claimed = await getClaimedData(signals.userAgentString);\n initialResults.claimed = claimed;\n\n // 4. Analyze Data\n const analysis = analyzeSpoofing(claimed, signals);\n initialResults.analysis = analysis;\n\n // 5. Format Final Output\n const tamperingResult = (): deviceTampering => {\n if (analysis.isSpoofed) {\n return { status: true, confidence: analysis.spoofingConfidence };\n } else {\n return { status: false };\n }\n };\n\n const finalResults: RefinedDeviceResults = {\n ...initialResults,\n deviceOs: analysis.realPlatform,\n deviceType: analysis.realDeviceType,\n tampering: tamperingResult(),\n };\n\n return finalResults;\n};\n","import { DeviceResults, ClaimedDevice } from '../../../core';\nimport { guessDeviceTypeFromUA } from './helpers';\n\n\ntype SignalData = DeviceResults['signals'];\n\n// What the device claims to be is gotten from the useragent string\nexport const getClaimedData = async (userAgentString: string): Promise<ClaimedDevice> => {\n const claimed = {} as ClaimedDevice;\n\n try {\n if ((navigator as any).userAgentData) {\n const uaData = await (navigator as any).userAgentData.getHighEntropyValues([\n \"platform\", \"platformVersion\", \"architecture\", \"model\", \"uaFullVersion\", \"brands\", \"mobile\",\n ]);\n claimed.platform = uaData.platform;\n claimed.mobile = uaData.mobile ?? null;\n claimed.brands = uaData.brands || [];\n\n // Initial guess - will be refined later using signals if needed\n if (claimed.mobile) {\n claimed.guessedDeviceType = screen.width > 768 ? \"tablet\" : \"mobile\";\n } else {\n claimed.guessedDeviceType = \"desktop\";\n }\n } else {\n const ua = userAgentString;\n const lowerUa = ua.toLowerCase();\n\n // Determine the device platform from user agent string\n if (lowerUa.includes(\"android\")) claimed.platform = \"Android\";\n else if (lowerUa.includes(\"iphone\") || lowerUa.includes(\"ipad\")) claimed.platform = \"iOS\";\n else if (lowerUa.includes(\"windows nt\")) claimed.platform = \"Windows\";\n else if (lowerUa.includes(\"mac os x\") || lowerUa.includes(\"macintosh\")) claimed.platform = \"macOS\";\n else if (lowerUa.includes(\"linux\")) claimed.platform = \"Linux\";\n\n const guessedType = guessDeviceTypeFromUA(ua);\n claimed.guessedDeviceType = guessedType;\n claimed.mobile = guessedType === 'mobile' || guessedType === 'tablet';\n\n const brandMatch = ua.match(/(Apple|Samsung|Google|Microsoft|Sony|LG|HTC|Nokia|Motorola|Huawei|Xiaomi|Pixel|Firefox|Safari|Edge|Chrome)/i);\n if (brandMatch) {\n const versionMatch = ua.match(new RegExp(brandMatch[0] + \"[ /]([\\\\d._]+)\"));\n claimed.brands.push({ brand: brandMatch[0], version: versionMatch ? versionMatch[1] : \"unknown\" });\n }\n }\n } catch (e) {\n console.error(\"Error getting User Agent Data:\", e);\n }\n return claimed;\n};\n\n// What we actually think the device could be achieved from some of this signals\nexport const getSignalData = (): SignalData => {\n const signals: SignalData = {\n actualPlatform: (navigator as any).userAgentData?.platform || navigator.platform ,\n touchPoints: navigator.maxTouchPoints || 0,\n screen: {\n width: screen.width,\n height: screen.height,\n pixelRatio: window.devicePixelRatio || 1,\n },\n webGL: { vendor: undefined, renderer: undefined, error: \"\" },\n userAgentString: navigator.userAgent,\n };\n\n try {\n const canvas = document.createElement(\"canvas\");\n const gl = canvas.getContext(\"webgl2\") || canvas.getContext(\"webgl\") || canvas.getContext(\"experimental-webgl\");\n\n if (gl && 'getParameter' in gl) {\n const debugInfo = gl.getExtension(\"WEBGL_debug_renderer_info\");\n if (debugInfo) {\n signals.webGL.vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) || \"n/a\";\n signals.webGL.renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) || \"n/a\";\n } else {\n signals.webGL.vendor = gl.getParameter(gl.VENDOR) || \"n/a (masked)\";\n signals.webGL.renderer = gl.getParameter(gl.RENDERER) || \"n/a (masked)\";\n if (!signals.webGL.vendor || signals.webGL.vendor === \"n/a (masked)\") {\n signals.webGL.error = \"Debug info extension unavailable or vendor masked\";\n }\n }\n } else {\n signals.webGL.error = \"WebGL context unavailable\";\n }\n } catch (error) {\n console.error(\"Error getting WebGL data:\", error);\n signals.webGL.error = error instanceof Error ? error.message : \"Unknown WebGL error\";\n }\n\n return signals;\n};","import { detectBrowser } from \"../components/system/browser\";\n\nexport async function getBrowserDetails() {\n const { name, version } = detectBrowser();\n\n return {\n name,\n version,\n user_agent: navigator.userAgent,\n };\n}\n","export function getCommonPixels(images: ImageData[], width: number, height: number ): ImageData {\n let finalData: number[] = [];\n for (let i = 0; i < images[0].data.length; i++) {\n let indice: number[] = [];\n for (let u = 0; u < images.length; u++) {\n indice.push(images[u].data[i]);\n }\n finalData.push(getMostFrequent(indice));\n }\n\n const pixelData = finalData;\n const pixelArray = new Uint8ClampedArray(pixelData);\n return new ImageData(pixelArray, width, height);\n}\n\nfunction getMostFrequent(arr: number[]): number {\n if (arr.length === 0) {\n return 0; // Handle empty array case\n }\n \n const frequencyMap: { [key: number]: number } = {};\n \n // Count occurrences of each number in the array\n for (const num of arr) {\n frequencyMap[num] = (frequencyMap[num] || 0) + 1;\n }\n \n let mostFrequent: number = arr[0];\n \n // Find the number with the highest frequency\n for (const num in frequencyMap) {\n if (frequencyMap[num] > frequencyMap[mostFrequent]) {\n mostFrequent = parseInt(num, 10);\n }\n }\n \n return mostFrequent;\n }","import { componentInterface, includeComponent } from '../../factory'\n\nasync function createAudioFingerprint(): Promise<componentInterface> {\n const resultPromise = new Promise<componentInterface>((resolve, reject) => {\n try {\n // Set up audio parameters\n const sampleRate = 44100;\n const numSamples = 5000;\n const audioContext = new (window.OfflineAudioContext || (window as any).webkitOfflineAudioContext)(1, numSamples, sampleRate );\n const audioBuffer = audioContext.createBufferSource();\n\n const analyser = audioContext.createAnalyser();\n\n const frequencyData = new Float32Array(analyser.frequencyBinCount);\n analyser.getFloatFrequencyData(frequencyData);\n \n \n const oscillator = audioContext.createOscillator();\n oscillator.frequency.value = 1000;\n const compressor = audioContext.createDynamicsCompressor();\n compressor.threshold.value = -50;\n compressor.knee.value = 40;\n compressor.ratio.value = 12;\n compressor.attack.value = 0;\n compressor.release.value = 0.2;\n oscillator.connect(compressor);\n compressor.connect(audioContext.destination);\n oscillator.start();\n \n audioContext.oncomplete = () => {\n resolve(\n {\n 'oscillator': oscillator.type,\n 'maxChannels': audioContext.destination.maxChannelCount,\n 'channelCountMode': audioBuffer.channelCountMode,\n 'frequencyBinCount': analyser.frequencyBinCount,\n \n } \n );\n };\n \n audioContext.startRendering();\n \n // audioContext.close();\n \n } catch (error) {\n console.error('Error creating audio fingerprint:', error);\n reject(error);\n }\n \n });\n \n return resultPromise;\n\n}\n\n\nincludeComponent('audio', createAudioFingerprint);","import { componentInterface, includeComponent } from '../../factory'\nimport { hash } from '../../utils/hash'\nimport { getCommonPixels } from '../../utils/commonPixels';\nimport { getBrowserName } from '../system/browser';\n\nconst _RUNS = (getBrowserName() !== 'SamsungBrowser') ? 1 : 3;\n\n/**\n * A simple canvas finger printing function\n * \n * @returns a CanvasInfo JSON object\n */\n\nconst _WIDTH = 280;\nconst _HEIGHT = 20;\n\nexport default function generateCanvasFingerprint(): Promise<componentInterface> {\n \n return new Promise((resolve) => {\n\n /**\n * Since some browsers fudge with the canvas pixels to prevent fingerprinting, the following\n * creates the canvas three times and getCommonPixels picks the most common byte for each\n * channel of each pixel.\n */\n const imageDatas: ImageData[] = Array.from({length: _RUNS}, () => generateCanvasImageData() );\n const commonImageData = getCommonPixels(imageDatas, _WIDTH, _HEIGHT);\n\n resolve(\n {\n 'commonImageDataHash': hash(commonImageData.data.toString()).toString(),\n }\n )\n });\n}\n\nfunction generateCanvasImageData(): ImageData {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n return new ImageData(1,1);\n }\n\n // Set canvas dimensions\n canvas.width = _WIDTH;\n canvas.height = _HEIGHT;\n\n // Create rainbow gradient for the background rectangle\n const gradient = ctx.createLinearGradient(0, 0, canvas.width, canvas.height);\n gradient.addColorStop(0, \"red\");\n gradient.addColorStop(1/6, \"orange\");\n gradient.addColorStop(2/6, \"yellow\");\n gradient.addColorStop(3/6, \"green\");\n gradient.addColorStop(4/6, \"blue\");\n gradient.addColorStop(5/6, \"indigo\");\n gradient.addColorStop(1, \"violet\");\n\n // Draw background rectangle with the rainbow gradient\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n // Draw some random text\n const randomText = 'Random Text WMwmil10Oo';\n ctx.font = '23.123px Arial';\n ctx.fillStyle = 'black';\n ctx.fillText(randomText, -5, 15);\n\n // Draw the same text with an offset, different color, and slight transparency\n ctx.fillStyle = 'rgba(0, 0, 255, 0.5)';\n ctx.fillText(randomText, -3.3, 17.7);\n\n // Draw a line crossing the image at an arbitrary angle\n ctx.beginPath();\n ctx.moveTo(0, 0);\n ctx.lineTo(canvas.width * 2/7, canvas.height);\n ctx.strokeStyle = 'white';\n ctx.lineWidth = 2;\n ctx.stroke();\n\n const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n // Return data URL of the canvas\n return imageData;\n}\n\nif (getBrowserName() != 'Firefox')\n includeComponent('canvas', generateCanvasFingerprint);\n\n","export async function ephemeralIFrame(callback: ({ iframe }: { iframe: Document }) => void): Promise<any> {\n\n while (!document.body) {\n await wait(50)\n }\n const iframe = document.createElement('iframe')\n iframe.setAttribute('frameBorder', '0')\n\n const style = iframe.style\n style.setProperty('position','fixed');\n style.setProperty('display', 'block', 'important')\n style.setProperty('visibility', 'visible')\n style.setProperty('border', '0');\n style.setProperty('opacity','0');\n \n iframe.src = 'about:blank'\n document.body.appendChild(iframe)\n \n const iframeDocument = iframe.contentDocument || iframe.contentWindow?.document;\n if (!iframeDocument) {\n throw new Error('Iframe document is not accessible');\n }\n \n // Execute the callback function with access to the iframe's document\n callback({ iframe: iframeDocument });\n \n // Clean up after running the callback\n setTimeout(() => {\n document.body.removeChild(iframe);\n }, 0);\n }\n\n export function wait<T = void>(durationMs: number, resolveWith?: T): Promise<T> {\n return new Promise((resolve) => setTimeout(resolve, durationMs, resolveWith))\n }","import { componentInterface, includeComponent } from '../../factory'\nimport { ephemeralIFrame } from '../../utils/ephemeralIFrame'\nimport { getBrowserName } from '../system/browser'\n\n\n\nconst availableFonts = [\n 'Arial',\n 'Arial Black',\n 'Arial Narrow',\n 'Arial Rounded MT',\n 'Arimo',\n 'Archivo',\n 'Barlow',\n 'Bebas Neue',\n 'Bitter',\n 'Bookman',\n 'Calibri',\n 'Cabin',\n 'Candara',\n 'Century',\n 'Century Gothic',\n 'Comic Sans MS',\n 'Constantia',\n 'Courier',\n 'Courier New',\n 'Crimson Text',\n 'DM Mono',\n 'DM Sans',\n 'DM Serif Display',\n 'DM Serif Text',\n 'Dosis',\n 'Droid Sans',\n 'Exo',\n 'Fira Code',\n 'Fira Sans',\n 'Franklin Gothic Medium',\n 'Garamond',\n 'Geneva',\n 'Georgia',\n 'Gill Sans',\n 'Helvetica',\n 'Impact',\n 'Inconsolata',\n 'Indie Flower',\n 'Inter',\n 'Josefin Sans',\n 'Karla',\n 'Lato',\n 'Lexend',\n 'Lucida Bright',\n 'Lucida Console',\n 'Lucida Sans Unicode',\n 'Manrope',\n 'Merriweather',\n 'Merriweather Sans',\n 'Montserrat',\n 'Myriad',\n 'Noto Sans',\n 'Nunito',\n 'Nunito Sans',\n 'Open Sans',\n 'Optima',\n 'Orbitron',\n 'Oswald',\n 'Pacifico',\n 'Palatino',\n 'Perpetua',\n 'PT Sans',\n 'PT Serif',\n 'Poppins',\n 'Prompt',\n 'Public Sans',\n 'Quicksand',\n 'Rajdhani',\n 'Recursive',\n 'Roboto',\n 'Roboto Condensed',\n 'Rockwell',\n 'Rubik',\n 'Segoe Print',\n 'Segoe Script',\n 'Segoe UI',\n 'Sora',\n 'Source Sans Pro',\n 'Space Mono',\n 'Tahoma',\n 'Taviraj',\n 'Times',\n 'Times New Roman',\n 'Titillium Web',\n 'Trebuchet MS',\n 'Ubuntu',\n 'Varela Round',\n 'Verdana',\n 'Work Sans',\n ];\n\n const baseFonts = ['monospace', 'sans-serif', 'serif'];\n\nexport default function getFontMetrics(): Promise<componentInterface> {\n \n return new Promise((resolve, reject) => {\n try {\n\n ephemeralIFrame(async ({ iframe }) => {\n\n const canvas = iframe.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n const defaultWidths: number[] = baseFonts.map((font) => {\n return measureSingleFont(ctx, font)\n })\n\n let results: {[k: string]: any} = {};\n availableFonts.forEach((font) => {\n const fontWidth = measureSingleFont(ctx, font);\n if (!defaultWidths.includes(fontWidth))\n results[font] = fontWidth;\n });\n \n resolve(results);\n })\n\n\n } catch (error) {\n reject({'error': 'unsupported'})\n }\n });\n};\n\n\nfunction measureSingleFont(ctx: CanvasRenderingContext2D | null, font: string): number {\n if (!ctx) {\n throw new Error('Canvas context not supported');\n }\n const text: string = \"WwMmLli0Oo\";\n ctx.font = `72px ${font}`; // Set a default font size\n return ctx.measureText(text).width;\n}\n\nif (getBrowserName() != 'Firefox')\n includeComponent('fonts', getFontMetrics);","import { componentInterface, includeComponent } from '../../factory'\n\nfunction getHardwareInfo(): Promise<componentInterface> {\n return new Promise((resolve) => {\n const memoryInfo = (window.performance && (window.performance as any).memory ) ? (window.performance as any).memory : 0\n resolve(\n {\n 'videocard': getVideoCard(),\n 'architecture': getArchitecture(),\n 'jsHeapSizeLimit': memoryInfo.jsHeapSizeLimit || 0\n }\n )\n });\n}\n\nfunction getVideoCard(): componentInterface | string {\n const canvas = document.createElement('canvas');\n const gl = canvas.getContext('webgl') ?? canvas.getContext('experimental-webgl');\n \n if (gl && 'getParameter' in gl) {\n try {\n // Try standard parameters first\n const vendor = (gl.getParameter(gl.VENDOR) || '').toString();\n const renderer = (gl.getParameter(gl.RENDERER) || '').toString();\n \n let result: componentInterface = {\n vendor: vendor,\n renderer: renderer,\n version: (gl.getParameter(gl.VERSION) || '').toString(),\n shadingLanguageVersion: (gl.getParameter(gl.SHADING_LANGUAGE_VERSION) || '').toString(),\n };\n \n // Only try debug info if needed and available\n \n const debugInfo = gl.getExtension(\"WEBGL_debug_renderer_info\");\n if (debugInfo) {\n const vendorUnmasked = (gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) || '').toString();\n const rendererUnmasked = (gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) || '').toString();\n \n // Only add unmasked values if they exist\n if (vendorUnmasked) {\n result.vendorUnmasked = vendorUnmasked;\n }\n if (rendererUnmasked) {\n result.rendererUnmasked = rendererUnmasked;\n }\n }\n \n return result;\n } catch (error) {\n // fail silently\n }\n }\n return \"undefined\";\n}\n\nfunction getArchitecture(): number {\n const f = new Float32Array(1);\n const u8 = new Uint8Array(f.buffer);\n f[0] = Infinity;\n f[0] = f[0] - f[0];\n\n return u8[3];\n}\n\nincludeComponent('hardware', getHardwareInfo);","function mostFrequentValue(arr: any[]): any | null {\n if (arr.length === 0) {\n return null; // Return null for an empty array\n }\n \n const frequencyMap: { [key: string]: number } = {};\n \n // Count occurrences of each element in the array\n arr.forEach((element) => {\n const key = String(element);\n frequencyMap[key] = (frequencyMap[key] || 0) + 1;\n });\n \n let mostFrequent: any = arr[0]; // Assume the first element is the most frequent\n let highestFrequency = 1; // Frequency of the assumed most frequent element\n \n // Find the element with the highest frequency\n Object.keys(frequencyMap).forEach((key) => {\n if (frequencyMap[key] > highestFrequency) {\n mostFrequent = key;\n highestFrequency = frequencyMap[key];\n }\n });\n \n return mostFrequent;\n }\n\nexport function mostFrequentValuesInArrayOfDictionaries(arr: { [key: string]: any }[], keys: string[]): { [key: string]: any } {\n const result: { [key: string]: any } = {};\n \n keys.forEach((key) => {\n const valuesForKey = arr.map((obj) => (key in obj ? obj[key] : undefined)).filter((val) => val !== undefined);\n const mostFrequentValueForKey = mostFrequentValue(valuesForKey);\n if (mostFrequentValueForKey)\n result[key] = mostFrequentValueForKey;\n });\n \n return result;\n }","import { componentInterface, includeComponent } from '../../factory';\nimport { mostFrequentValuesInArrayOfDictionaries } from '../../utils/getMostFrequent';\nimport { options } from '../../modules/options';\n\nlet permission_keys: PermissionName[];\nfunction initializePermissionKeys() {\n permission_keys = options?.permissions_to_check || [\n 'accelerometer',\n 'accessibility', 'accessibility-events',\n 'ambient-light-sensor',\n 'background-fetch', \n 'background-sync', \n 'bluetooth',\n 'clipboard-read',\n 'clipboard-write',\n 'device-info', \n 'display-capture',\n 'gyroscope', \n 'local-fonts',\n 'magnetometer', \n 'midi',\n 'nfc', 'notifications',\n 'payment-handler',\n 'persistent-storage',\n 'speaker', 'storage-access',\n 'top-level-storage-access',\n 'window-management',\n 'query',\n ] as PermissionName[];\n}\n\nexport default async function getBrowserPermissions(): Promise<componentInterface> {\n initializePermissionKeys();\n const permissionPromises: Promise<componentInterface>[] = Array.from({length: options?.retries || 3}, () => getBrowserPermissionsOnce() );\n return Promise.all(permissionPromises).then((resolvedPermissions) => {\n const permission = mostFrequentValuesInArrayOfDictionaries(resolvedPermissions, permission_keys);\n return permission;\n });\n}\n\nasync function getBrowserPermissionsOnce(): Promise<componentInterface> {\n\n const permissionStatus: { [key: string]: string } = {};\n\n for (const feature of permission_keys) {\n try {\n // Request permission status for each feature\n const status = await navigator.permissions.query({ name: feature });\n\n // Assign permission status to the object\n permissionStatus[feature] = status.state.toString();\n } catch (error) {\n // In case of errors (unsupported features, etc.), do nothing. Not listing them is the same as not supported\n }\n }\n\n return permissionStatus;\n}\n\nincludeComponent(\"permissions\", getBrowserPermissions);","/*\n * This file contains functions to work with pure data only (no browser features, DOM, side effects, etc).\n */\n\n/**\n * Does the same as Array.prototype.includes but has better typing\n */\nexport function includes<THaystack>(haystack: ArrayLike<THaystack>, needle: unknown): needle is THaystack {\n for (let i = 0, l = haystack.length; i < l; ++i) {\n if (haystack[i] === needle) {\n return true\n }\n }\n return false\n }\n \n /**\n * Like `!includes()` but with proper typing\n */\n export function excludes<THaystack, TNeedle>(\n haystack: ArrayLike<THaystack>,\n needle: TNeedle,\n ): needle is Exclude<TNeedle, THaystack> {\n return !includes(haystack, needle)\n }\n \n /**\n * Be careful, NaN can return\n */\n export function toInt(value: unknown): number {\n return parseInt(value as string)\n }\n \n /**\n * Be careful, NaN can return\n */\n export function toFloat(value: unknown): number {\n return parseFloat(value as string)\n }\n \n export function replaceNaN<T, U>(value: T, replacement: U): T | U {\n return typeof value === 'number' && isNaN(value) ? replacement : value\n }\n \n export function countTruthy(values: unknown[]): number {\n return values.reduce<number>((sum, value) => sum + (value ? 1 : 0), 0)\n }\n \n export function round(value: number, base = 1): number {\n if (Math.abs(base) >= 1) {\n return Math.round(value / base) * base\n } else {\n // Sometimes when a number is multiplied by a small number, precision is lost,\n // for example 1234 * 0.0001 === 0.12340000000000001, and it's more precise divide: 1234 / (1 / 0.0001) === 0.1234.\n const counterBase = 1 / base\n return Math.round(value * counterBase) / counterBase\n }\n }\n \n /**\n * Parses a CSS selector into tag name with HTML attributes.\n * Only single element selector are supported (without operators like space, +, >, etc).\n *\n * Multiple values can be returned for each attribute. You decide how to handle them.\n */\n export function parseSimpleCssSelector(\n selector: string,\n ): [tag: string | undefined, attributes: Record<string, string[]>] {\n const errorMessage = `Unexpected syntax '${selector}'`\n const tagMatch = /^\\s*([a-z-]*)(.*)$/i.exec(selector) as RegExpExecArray\n const tag = tagMatch[1] || undefined\n const attributes: Record<string, string[]> = {}\n const partsRegex = /([.:#][\\w-]+|\\[.+?\\])/gi\n \n const addAttribute = (name: string, value: string) => {\n attributes[name] = attributes[name] || []\n attributes[name].push(value)\n }\n \n for (;;) {\n const match = partsRegex.exec(tagMatch[2])\n if (!match) {\n break\n }\n const part = match[0]\n switch (part[0]) {\n case '.':\n addAttribute('class', part.slice(1))\n break\n case '#':\n addAttribute('id', part.slice(1))\n break\n case '[': {\n const attributeMatch = /^\\[([\\w-]+)([~|^$*]?=(\"(.*?)\"|([\\w-]+)))?(\\s+[is])?\\]$/.exec(part)\n if (attributeMatch) {\n addAttribute(attributeMatch[1], attributeMatch[4] ?? attributeMatch[5] ?? '')\n } else {\n throw new Error(errorMessage)\n }\n break\n }\n default:\n throw new Error(errorMessage)\n }\n }\n \n return [tag, attributes]\n }\n \n export function areSetsEqual(set1: Set<unknown>, set2: Set<unknown>): boolean {\n if (set1 === set2) {\n return true\n }\n if (set1.size !== set2.size) {\n return false\n }\n \n for (let iter = set1.values(), step = iter.next(); !step.done; step = iter.next()) {\n if (!set2.has(step.value)) {\n return false\n }\n }\n return true\n }\n \n export function maxInIterator<T>(iterator: Iterator<T>, getItemScore: (item: T) => number): T | undefined {\n let maxItem: T | undefined\n let maxItemScore: number | undefined\n \n for (let step = iterator.next(); !step.done; step = iterator.next()) {\n const item = step.value\n const score = getItemScore(item)\n if (maxItemScore === undefined || score > maxItemScore) {\n maxItem = item\n maxItemScore = score\n }\n }\n \n return maxItem\n }\n \n /**\n * Converts a string to UTF8 bytes\n */\n export function getUTF8Bytes(input: string): Uint8Array {\n // Benchmark: https://jsbench.me/b6klaaxgwq/1\n // If you want to just count bytes, see solutions at https://jsbench.me/ehklab415e/1\n const result = new Uint8Array(input.length)\n for (let i = 0; i < input.length; i++) {\n // `charCode` is faster than encoding, so we prefer that when it's possible\n const charCode = input.charCodeAt(i)\n \n // In case of non-ASCII symbols we use proper encoding\n if (charCode > 127) {\n return new TextEncoder().encode(input)\n }\n result[i] = charCode\n }\n return result\n }\n ","import { countTruthy } from './data'\nimport { isFunctionNative } from './misc'\n\n/*\n * Functions to help with features that vary through browsers\n */\n\n/**\n * Checks whether the browser is based on Trident (the Internet Explorer engine) without using user-agent.\n *\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nexport function isTrident(): boolean {\n const w = window\n const n = navigator\n\n // The properties are checked to be in IE 10, IE 11 and not to be in other browsers in October 2020\n return (\n countTruthy([\n 'MSCSSMatrix' in w,\n 'msSetImmediate' in w,\n 'msIndexedDB' in w,\n 'msMaxTouchPoints' in n,\n 'msPointerEnabled' in n,\n ]) >= 4\n )\n}\n\n/**\n * Checks whether the browser is based on EdgeHTML (the pre-Chromium Edge engine) without using user-agent.\n *\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nexport function isEdgeHTML(): boolean {\n // Based on research in October 2020\n const w = window\n const n = navigator\n\n return (\n countTruthy(['msWriteProfilerMark' in w, 'MSStream' in w, 'msLaunchUri' in n, 'msSaveBlob' in n]) >= 3 &&\n !isTrident()\n )\n}\n\n/**\n * Checks whether the browser is based on Chromium without using user-agent.\n *\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nexport function isChromium(): boolean {\n // Based on research in October 2020. Tested to detect Chromium 42-86.\n const w = window\n const n = navigator\n\n return (\n countTruthy([\n 'webkitPersistentStorage' in n,\n 'webkitTemporaryStorage' in n,\n (n.vendor || '').indexOf('Google') === 0,\n 'webkitResolveLocalFileSystemURL' in w,\n 'BatteryManager' in w,\n 'webkitMediaStream' in w,\n 'webkitSpeechGrammar' in w,\n ]) >= 5\n )\n}\n\n/**\n * Checks whether the browser is based on mobile or desktop Safari without using user-agent.\n * All iOS browsers use WebKit (the Safari engine).\n *\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nexport function isWebKit(): boolean {\n // Based on research in August 2024\n const w = window\n const n = navigator\n\n return (\n countTruthy([\n 'ApplePayError' in w,\n 'CSSPrimitiveValue' in w,\n 'Counter' in w,\n n.vendor.indexOf('Apple') === 0,\n 'RGBColor' in w,\n 'WebKitMediaKeys' in w,\n ]) >= 4\n )\n}\n\n/**\n * Checks whether this WebKit browser is a desktop browser.\n * It doesn't check that the browser is based on WebKit, there is a separate function for this.\n *\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nexport function isDesktopWebKit(): boolean {\n // Checked in Safari and DuckDuckGo\n\n const w = window\n const { HTMLElement, Document } = w\n\n return (\n countTruthy([\n 'safari' in w, // Always false in Karma and BrowserStack Automate\n !('ongestureend' in w),\n !('TouchEvent' in w),\n !('orientation' in w),\n HTMLElement && !('autocapitalize' in HTMLElement.prototype),\n Document && 'pointerLockElement' in Document.prototype,\n ]) >= 4\n )\n}\n\n/**\n * Checks whether this WebKit browser is Safari.\n * It doesn't check that the browser is based on WebKit, there is a separate function for this.\n *\n * Warning! The function works properly only for Safari version 15.4 and newer.\n */\nexport function isSafariWebKit(): boolean {\n // Checked in Safari, Chrome, Firefox, Yandex, UC Browser, Opera, Edge and DuckDuckGo.\n // iOS Safari and Chrome were checked on iOS 11-18. DuckDuckGo was checked on iOS 17-18 and macOS 14-15.\n // Desktop Safari versions 12-18 were checked.\n // The other browsers were checked on iOS 17 and 18; there was no chance to check them on the other OS versions.\n\n const w = window\n\n return (\n // Filters-out Chrome, Yandex, DuckDuckGo (macOS and iOS), Edge\n isFunctionNative(w.print) &&\n // Doesn't work in Safari < 15.4\n String((w as unknown as Record<string, unknown>).browser) === '[object WebPageNamespace]'\n )\n}\n\n/**\n * Checks whether the browser is based on Gecko (Firefox engine) without using user-agent.\n *\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nexport function isGecko(): boolean {\n const w = window\n\n // Based on research in September 2020\n return (\n countTruthy([\n 'buildID' in navigator,\n 'MozAppearance' in (document.documentElement?.style ?? {}),\n 'onmozfullscreenchange' in w,\n 'mozInnerScreenX' in w,\n 'CSSMozDocumentRule' in w,\n 'CanvasCaptureMediaStream' in w,\n ]) >= 4\n )\n}\n\n/**\n * Checks whether the browser is based on Chromium version ≥86 without using user-agent.\n * It doesn't check that the browser is based on Chromium, there is a separate function for this.\n */\nexport function isChromium86OrNewer(): boolean {\n // Checked in Chrome 85 vs Chrome 86 both on desktop and Android. Checked in macOS Chrome 128, Android Chrome 127.\n const w = window\n\n return (\n countTruthy([\n !('MediaSettingsRange' in w),\n 'RTCEncodedAudioFrame' in w,\n '' + w.Intl === '[object Intl]',\n '' + w.Reflect === '[object Reflect]',\n ]) >= 3\n )\n}\n\n/**\n * Checks whether the browser is based on Chromium version ≥122 without using user-agent.\n * It doesn't check that the browser is based on Chromium, there is a separate function for this.\n */\nexport function isChromium122OrNewer(): boolean {\n // Checked in Chrome 121 vs Chrome 122 and 129 both on desktop and Android\n const w: any = window\n const { URLPattern } = w\n\n return (\n countTruthy([\n 'union' in Set.prototype,\n 'Iterator' in w,\n URLPattern && 'hasRegExpGroups' in URLPattern.prototype,\n 'RGB8' in WebGLRenderingContext.prototype,\n ]) >= 3\n )\n}\n\n/**\n * Checks whether the browser is based on WebKit version ≥606 (Safari ≥12) without using user-agent.\n * It doesn't check that the browser is based on WebKit, there is a separate function for this.\n *\n * @see https://en.wikipedia.org/wiki/Safari_version_history#Release_history Safari-WebKit versions map\n */\nexport function isWebKit606OrNewer(): boolean {\n // Checked in Safari 9–18\n const w = window\n\n return (\n countTruthy([\n 'DOMRectList' in w,\n 'RTCPeerConnectionIceEvent' in w,\n 'SVGGeometryElement' in w,\n 'ontransitioncancel' in w,\n ]) >= 3\n )\n}\n\n/**\n * Checks whether the browser is based on WebKit version ≥616 (Safari ≥17) without using user-agent.\n * It doesn't check that the browser is based on WebKit, there is a separate function for this.\n *\n * @see https://developer.apple.com/documentation/safari-release-notes/safari-17-release-notes Safari 17 release notes\n * @see https://tauri.app/v1/references/webview-versions/#webkit-versions-in-safari Safari-WebKit versions map\n */\nexport function isWebKit616OrNewer(): boolean {\n const w = window\n const n = navigator\n const { CSS, HTMLButtonElement } = w\n\n return (\n countTruthy([\n !('getStorageUpdates' in n),\n HTMLButtonElement && 'popover' in HTMLButtonElement.prototype,\n 'CSSCounterStyleRule' in w,\n CSS.supports('font-size-adjust: ex-height 0.5'),\n CSS.supports('text-transform: full-width'),\n ]) >= 4\n )\n}\n\n/**\n * Checks whether the device is an iPad.\n * It doesn't check that the engine is WebKit and that the WebKit isn't desktop.\n */\nexport function isIPad(): boolean {\n // Checked on:\n // Safari on iPadOS (both mobile and desktop modes): 8, 11-18\n // Chrome on iPadOS (both mobile and desktop modes): 11-18\n // Safari on iOS (both mobile and desktop modes): 9-18\n // Chrome on iOS (both mobile and desktop modes): 9-18\n\n // Before iOS 13. Safari tampers the value in \"request desktop site\" mode since iOS 13.\n if (navigator.platform === 'iPad') {\n return true\n }\n\n const s = screen\n const screenRatio = s.width / s.height\n\n return (\n countTruthy([\n // Since iOS 13. Doesn't work in Chrome on iPadOS <15, but works in desktop mode.\n 'MediaSource' in window,\n // Since iOS 12. Doesn't work in Chrome on iPadOS.\n !!(Element as any).prototype.webkitRequestFullscreen,\n // iPhone 4S that runs iOS 9 matches this, but it is not supported\n // Doesn't work in incognito mode of Safari ≥17 with split screen because of tracking prevention\n screenRatio > 0.65 && screenRatio < 1.53,\n ]) >= 2\n )\n}\n\n/**\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nexport function getFullscreenElement(): Element | null {\n const d: any = document\n return d.fullscreenElement || d.msFullscreenElement || d.mozFullScreenElement || d.webkitFullscreenElement || null\n}\n\nexport function exitFullscreen(): Promise<void> {\n const d: any = document\n // `call` is required because the function throws an error without a proper \"this\" context\n return (d.exitFullscreen || d.msExitFullscreen || d.mozCancelFullScreen || d.webkitExitFullscreen).call(d)\n}\n\n/**\n * Checks whether the device runs on Android without using user-agent.\n *\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nexport function isAndroid(): boolean {\n const isItChromium = isChromium()\n const isItGecko = isGecko()\n const w = window\n const n = navigator\n // Chrome removes all words \"Android\" from `navigator` when desktop version is requested\n // Firefox keeps \"Android\" in `navigator.appVersion` when desktop version is requested\n if (isItChromium) {\n return (\n countTruthy([\n !('SharedWorker' in w),\n // `typechange` is deprecated, but it's still present on Android (tested on Chrome Mobile 117)\n // Removal proposal https://bugs.chromium.org/p/chromium/issues/detail?id=699892\n // Note: this expression returns true on ChromeOS, so additional detectors are required to avoid false-positives\n // n[c] && 'ontypechange' in n[c],\n !('sinkId' in new Audio()),\n ]) >= 2\n )\n } else if (isItGecko) {\n return countTruthy(['onorientationchange' in w, 'orientation' in w, /android/i.test(n.appVersion)]) >= 2\n } else {\n // Only 2 browser engines are presented on Android.\n // Actually, there is also Android 4.1 browser, but it's not worth detecting it at the moment.\n return false\n }\n}\n\n/**\n * Checks whether the browser is Samsung Internet without using user-agent.\n * It doesn't check that the browser is based on Chromium, please use `isChromium` before using this function.\n *\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nexport function isSamsungInternet(): boolean {\n // Checked in Samsung Internet 21, 25 and 27\n const n = navigator\n const w = window\n const audioPrototype = Audio.prototype\n const { visualViewport } = w\n\n return (\n countTruthy([\n 'srLatency' in audioPrototype,\n 'srChannelCount' in audioPrototype,\n 'devicePosture' in n, // Not available in HTTP\n visualViewport && 'segments' in visualViewport,\n 'getTextInformation' in Image.prototype, // Not available in Samsung Internet 21\n ]) >= 3\n )\n}\n","/**\n * Converts an error object to a plain object that can be used with `JSON.stringify`.\n * If you just run `JSON.stringify(error)`, you'll get `'{}'`.\n */\nexport function errorToObject(error: Readonly<Error>): Record<string, unknown> {\n return {\n name: error.name,\n message: error.message,\n stack: error.stack?.split('\\n'),\n // The fields are not enumerable, so TS is wrong saying that they will be overridden\n ...(error as Omit<Error, 'name' | 'message'>),\n }\n }\n \n export function isFunctionNative(func: (...args: unknown[]) => unknown): boolean {\n return /^function\\s.*?\\{\\s*\\[native code]\\s*}$/.test(String(func))\n }\n ","import { componentInterface, includeComponent } from '../../factory'\n\nfunction getLocales(): Promise<componentInterface> {\n return new Promise((resolve) => {\n resolve(\n {\n 'languages': getUserLanguage(),\n 'timezone': getUserTimezone()\n });\n });\n}\n\nfunction getUserLanguage(): string {\n return navigator.language;\n}\n\nfunction getUserTimezone(): string {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n}\n\nincludeComponent('locales', getLocales);","import { componentInterface, includeComponent } from '../../factory';\n\nfunction screenDetails(): Promise<componentInterface> {\n return new Promise((resolve) => {\n resolve(\n {\n 'colorDepth': screen.colorDepth,\n }\n );\n });\n}\n\nincludeComponent('screen', screenDetails);","import { includeComponent } from \"../../factory\";\nimport {\n isSafariWebKit,\n isWebKit,\n isWebKit616OrNewer,\n} from \"../../utils/browser_\";\nimport { replaceNaN, toInt } from \"../../utils/data\";\n\ntype ScreenResolution = [number | null, number | null];\n\n/**\n * A version of the entropy source with stabilization to make it suitable for static fingerprinting.\n * The window resolution is always the document size in private mode of Safari 17,\n * so the window resolution is not used in Safari 17.\n */\nexport default async function getScreenResolution(): Promise<any> {\n if (isWebKit() && isWebKit616OrNewer() && isSafariWebKit()) {\n return [];\n }\n\n return getUnstableScreenResolution();\n}\n\n/**\n * A version of the entropy source without stabilization.\n *\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nexport function getUnstableScreenResolution(): ScreenResolution {\n const s = screen;\n\n // Some browsers return screen resolution as strings, e.g. \"1200\", instead of a number, e.g. 1200.\n // I suspect it's done by certain plugins that randomize browser properties to prevent fingerprinting.\n // Some browsers even return screen resolution as not numbers.\n const parseDimension = (value: unknown) => replaceNaN(toInt(value), null);\n const dimensions = [\n parseDimension(s.width),\n parseDimension(s.height),\n ] as ScreenResolution;\n dimensions.sort().reverse();\n return dimensions;\n}\n\nincludeComponent(\"screenResolution\", getScreenResolution);\n","import { componentInterface, } from '../../factory'\nimport { hash } from '../../utils/hash'\nimport { getCommonPixels } from '../../utils/commonPixels';\nimport { getBrowser } from '../system/browser';\n\nconst _RUNS = (getBrowser().name !== 'SamsungBrowser') ? 1 : 3;\nlet canvas: HTMLCanvasElement\nlet gl: WebGLRenderingContext | null = null;\n\nfunction initializeCanvasAndWebGL() {\n if (typeof document !== 'undefined') {\n canvas = document.createElement('canvas');\n canvas.width = 200;\n canvas.height = 100;\n gl = canvas.getContext('webgl');\n }\n}\n\nexport async function createWebGLFingerprint(): Promise<componentInterface | undefined> {\n initializeCanvasAndWebGL();\n \n try {\n\n if (!gl) {\n throw new Error('WebGL not supported');\n }\n\n\n const imageDatas: ImageData[] = Array.from({length: _RUNS}, () => createWebGLImageData() );\n // and then checking the most common bytes for each channel of each pixel\n const commonImageData = getCommonPixels(imageDatas, canvas.width, canvas.height);\n //const imageData = createWebGLImageData()\n\n return {\n 'commonImageHash': hash(commonImageData.data.toString()).toString(),\n }\n } catch (error) {\n return \n }\n}\n\nfunction createWebGLImageData(): ImageData {\n try {\n\n if (!gl) {\n throw new Error('WebGL not supported');\n }\n\n const vertexShaderSource = `\n attribute vec2 position;\n void main() {\n gl_Position = vec4(position, 0.0, 1.0);\n }\n `;\n\n const fragmentShaderSource = `\n precision mediump float;\n void main() {\n gl_FragColor = vec4(0.812, 0.195, 0.553, 0.921); // Set line color\n }\n `;\n\n const vertexShader = gl.createShader(gl.VERTEX_SHADER);\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n\n if (!vertexShader || !fragmentShader) {\n throw new Error('Failed to create shaders');\n }\n\n gl.shaderSource(vertexShader, vertexShaderSource);\n gl.shaderSource(fragmentShader, fragmentShaderSource);\n\n gl.compileShader(vertexShader);\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n throw new Error('Vertex shader compilation failed: ' + gl.getShaderInfoLog(vertexShader));\n }\n\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n throw new Error('Fragment shader compilation failed: ' + gl.getShaderInfoLog(fragmentShader));\n }\n\n const shaderProgram = gl.createProgram();\n\n if (!shaderProgram) {\n throw new Error('Failed to create shader program');\n }\n\n gl.attachShader(shaderProgram, vertexShader);\n gl.attachShader(shaderProgram, fragmentShader);\n gl.linkProgram(shaderProgram);\n if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {\n throw new Error('Shader program linking failed: ' + gl.getProgramInfoLog(shaderProgram));\n }\n\n gl.useProgram(shaderProgram);\n\n // Set up vertices to form lines\n const numSpokes: number = 137;\n const vertices = new Float32Array(numSpokes * 4);\n const angleIncrement = (2 * Math.PI) / numSpokes;\n\n for (let i = 0; i < numSpokes; i++) {\n const angle = i * angleIncrement;\n\n // Define two points for each line (spoke)\n vertices[i * 4] = 0; // Center X\n vertices[i * 4 + 1] = 0; // Center Y\n vertices[i * 4 + 2] = Math.cos(angle) * (canvas.width / 2); // Endpoint X\n vertices[i * 4 + 3] = Math.sin(angle) * (canvas.height / 2); // Endpoint Y\n }\n\n const vertexBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n\n const positionAttribute = gl.getAttribLocation(shaderProgram, 'position');\n gl.enableVertexAttribArray(positionAttribute);\n gl.vertexAttribPointer(positionAttribute, 2, gl.FLOAT, false, 0, 0);\n\n // Render\n gl.viewport(0, 0, canvas.width, canvas.height);\n gl.clearColor(0.0, 0.0, 0.0, 1.0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.drawArrays(gl.LINES, 0, numSpokes * 2);\n\n const pixelData = new Uint8ClampedArray(canvas.width * canvas.height * 4);\n gl.readPixels(0, 0, canvas.width, canvas.height, gl.RGBA, gl.UNSIGNED_BYTE, pixelData);\n const imageData = new ImageData(pixelData, canvas.width, canvas.height);\n\n return imageData;\n } catch (error) {\n //console.error(error);\n return new ImageData(1, 1);\n } finally {\n if (gl) {\n // Reset WebGL state\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n gl.useProgram(null);\n gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n gl.clearColor(0.0, 0.0, 0.0, 0.0);\n }\n }\n}\n","import { componentInterface, includeComponent } from '../../factory';\nimport { detectBrowser } from './browser'\n\nasync function getSystemDetails(): Promise<componentInterface> {\n return new Promise((resolve) => {\n // Get detailed browser information\n const browserDetails = detectBrowser();\n \n resolve({\n 'platform': window.navigator.platform,\n 'cookieEnabled': window.navigator.cookieEnabled,\n 'productSub': navigator.productSub,\n 'product': navigator.product,\n 'browser': {\n 'name': browserDetails.name,\n },\n 'applePayVersion': getApplePayVersion(),\n });\n });\n}\n\n/**\n * Generates a unique browser hash based on various browser characteristics\n * that can be used for fingerprinting\n */\n// function generateBrowserHash(): string {\n// const characteristics = [\n// navigator.userAgent,\n// navigator.language,\n// navigator.hardwareConcurrency,\n// navigator.deviceMemory,\n// navigator.platform,\n// screen.colorDepth,\n// navigator.maxTouchPoints,\n// 'chrome' in window ? 'chrome' : 'no-chrome',\n// 'opr' in window ? 'opera' : 'no-opera',\n// 'safari' in window ? 'safari' : 'no-safari',\n// new Date().getTimezoneOffset(),\n// screen.width + 'x' + screen.height\n// ];\n \n// // Use simple hashing algorithm\n// let hash = 0;\n// const str = characteristics.join('||');\n \n// for (let i = 0; i < str.length; i++) {\n// const char = str.charCodeAt(i);\n// hash = ((hash << 5) - hash) + char;\n// hash = hash & hash; // Convert to 32bit integer\n// }\n\n// // Convert to hex string\n// return (hash >>> 0).toString(16).padStart(8, '0');\n// }\n\n/**\n * @returns applePayCanMakePayments: boolean, applePayMaxSupportedVersion: number\n */\nfunction getApplePayVersion(): number {\n if (window.location.protocol === 'https:' && typeof (window as any).ApplePaySession === 'function') {\n try {\n const versionCheck = (window as any).ApplePaySession.supportsVersion;\n for (let i = 15; i > 0; i--) {\n if (versionCheck(i)) {\n return i;\n }\n }\n } catch (error) {\n return 0\n }\n }\n return 0\n}\n\nincludeComponent('system', getSystemDetails);\n\n","import { componentInterface, includeComponent } from \"../../factory\";\nimport { isChromium, isGecko, isWebKit } from \"../../utils/browser_\";\nimport { createWebGLFingerprint } from \"./imageHash\";\n\n// Types and constants are used instead of interfaces and enums to avoid this error in projects which use this library:\n// Exported variable '...' has or is using name '...' from external module \"...\" but cannot be named.\n\n\n/**\n * WebGL extended features\n */\ntype WebGlExtensionsPayload = {\n contextAttributes: string[]; // ['alpha=true', 'antialias=true...\n parameters: string[]; // ['ACTIVE_TEXTURE(33984)', 'ALIASED_LINE_WID...\n shaderPrecisions: string[]; // ['FRAGMENT_SHADER.LOW_FLOAT=127,127,23...\n extensions: string[] | null; // ['ANGLE_instanced_arrays', 'EXT_blend_minmax', 'EXT_color...\n extensionParameters: string[]; // ['COMPRESSED_RGB_S3TC_DXT1_EXT(33776)', 'COMPR...\n unsupportedExtensions: string[]; // ['EXT_blend_minmax', 'EXT_color...\n};\n\ntype CanvasContext = WebGLRenderingContext & {\n readonly canvas: HTMLCanvasElement;\n};\n\ntype Options = {\n cache: {\n webgl?: {\n context: CanvasContext | undefined;\n };\n };\n};\n\n/** WebGl context is not available */\nexport const STATUS_NO_GL_CONTEXT = -1;\n/** WebGL context `getParameter` method is not a function */\nexport const STATUS_GET_PARAMETER_NOT_A_FUNCTION = -2;\n\nexport type SpecialStatus =\n | typeof STATUS_NO_GL_CONTEXT\n | typeof STATUS_GET_PARAMETER_NOT_A_FUNCTION;\n\nconst validContextParameters = new Set([\n 10752, 2849, 2884, 2885, 2886, 2928, 2929, 2930, 2931, 2932, 2960, 2961, 2962,\n 2963, 2964, 2965, 2966, 2967, 2968, 2978, 3024, 3042, 3088, 3089, 3106, 3107,\n 32773, 32777, 32777, 32823, 32824, 32936, 32937, 32938, 32939, 32968, 32969,\n 32970, 32971, 3317, 33170, 3333, 3379, 3386, 33901, 33902, 34016, 34024,\n 34076, 3408, 3410, 3411, 3412, 3413, 3414, 3415, 34467, 34816, 34817, 34818,\n 34819, 34877, 34921, 34930, 35660, 35661, 35724, 35738, 35739, 36003, 36004,\n 36005, 36347, 36348, 36349, 37440, 37441, 37443, 7936, 7937, 7938,\n // SAMPLE_ALPHA_TO_COVERAGE (32926) and SAMPLE_COVERAGE (32928) are excluded because they trigger a console warning\n // in IE, Chrome ≤ 59 and Safari ≤ 13 and give no entropy.\n]);\nconst validExtensionParams = new Set([\n 34047, // MAX_TEXTURE_MAX_ANISOTROPY_EXT\n 35723, // FRAGMENT_SHADER_DERIVATIVE_HINT_OES\n 36063, // MAX_COLOR_ATTACHMENTS_WEBGL\n 34852, // MAX_DRAW_BUFFERS_WEBGL\n 34853, // DRAW_BUFFER0_WEBGL\n 34854, // DRAW_BUFFER1_WEBGL\n 34229, // VERTEX_ARRAY_BINDING_OES\n 36392, // TIMESTAMP_EXT\n 36795, // GPU_DISJOINT_EXT\n 38449, // MAX_VIEWS_OVR\n]);\nconst shaderTypes = [\"FRAGMENT_SHADER\", \"VERTEX_SHADER\"] as const;\nconst precisionTypes = [\n \"LOW_FLOAT\",\n \"MEDIUM_FLOAT\",\n \"HIGH_FLOAT\",\n \"LOW_INT\",\n \"MEDIUM_INT\",\n \"HIGH_INT\",\n] as const;\nconst rendererInfoExtensionName = \"WEBGL_debug_renderer_info\";\nconst polygonModeExtensionName = \"WEBGL_polygon_mode\";\n\n/**\n * Gets the basic and simple WebGL parameters\n */\nexport async function getWebGlBasics(\n { cache = {} }: Options = { cache: {} }\n): Promise<componentInterface> {\n const gl = getWebGLContext(cache);\n if (!gl) {\n return { status: STATUS_NO_GL_CONTEXT };\n }\n\n if (!isValidParameterGetter(gl)) {\n return { status: STATUS_GET_PARAMETER_NOT_A_FUNCTION };\n }\n\n const debugExtension = shouldAvoidDebugRendererInfo()\n ? null\n : gl.getExtension(rendererInfoExtensionName);\n\n const imageHash = await createWebGLFingerprint();\n\n return {\n version: gl.getParameter(gl.VERSION)?.toString() || \"\",\n vendor: gl.getParameter(gl.VENDOR)?.toString() || \"\",\n vendorUnmasked: debugExtension\n ? gl.getParameter(debugExtension.UNMASKED_VENDOR_WEBGL)?.toString()\n : \"\",\n renderer: gl.getParameter(gl.RENDERER)?.toString() || \"\",\n rendererUnmasked: debugExtension\n ? gl.getParameter(debugExtension.UNMASKED_RENDERER_WEBGL)?.toString()\n : \"\",\n shadingLanguageVersion:\n gl.getParameter(gl.SHADING_LANGUAGE_VERSION)?.toString() || \"\",\n ...imageHash,\n };\n}\n\n/**\n * Gets the advanced and massive WebGL parameters and extensions\n */\nexport async function getWebGlExtensions(\n { cache = {} }: Options = { cache: {} }\n): Promise<WebGlExtensionsPayload | SpecialStatus> {\n const gl = getWebGLContext(cache);\n if (!gl) {\n return STATUS_NO_GL_CONTEXT;\n }\n\n if (!isValidParameterGetter(gl)) {\n return STATUS_GET_PARAMETER_NOT_A_FUNCTION;\n }\n\n const extensions = gl.getSupportedExtensions();\n const contextAttributes = gl.getContextAttributes();\n const unsupportedExtensions: string[] = [];\n\n // Features\n const attributes: string[] = [];\n const parameters: string[] = [];\n const extensionParameters: string[] = [];\n const shaderPrecisions: string[] = [];\n\n // Context attributes\n if (contextAttributes) {\n for (const attributeName of Object.keys(\n contextAttributes\n ) as (keyof WebGLContextAttributes)[]) {\n attributes.push(`${attributeName}=${contextAttributes[attributeName]}`);\n }\n }\n\n // Context parameters\n const constants = getConstantsFromPrototype(gl);\n for (const constant of constants) {\n const code = gl[constant] as number;\n parameters.push(\n `${constant}=${code}${\n validContextParameters.has(code) ? `=${gl.getParameter(code)}` : \"\"\n }`\n );\n }\n\n // Extension parameters\n if (extensions) {\n for (const name of extensions) {\n if (\n (name === rendererInfoExtensionName &&\n shouldAvoidDebugRendererInfo()) ||\n (name === polygonModeExtensionName &&\n shouldAvoidPolygonModeExtensions())\n ) {\n continue;\n }\n\n const extension = gl.getExtension(name);\n if (!extension) {\n unsupportedExtensions.push(name);\n continue;\n }\n\n for (const constant of getConstantsFromPrototype(extension)) {\n const code = extension[constant];\n extensionParameters.push(\n `${constant}=${code}${\n validExtensionParams.has(code) ? `=${gl.getParameter(code)}` : \"\"\n }`\n );\n }\n }\n }\n\n // Shader precision\n for (const shaderType of shaderTypes) {\n for (const precisionType of precisionTypes) {\n const shaderPrecision = getShaderPrecision(gl, shaderType, precisionType);\n shaderPrecisions.push(\n `${shaderType}.${precisionType}=${shaderPrecision.join(\",\")}`\n );\n }\n }\n\n // Postprocess\n extensionParameters.sort();\n parameters.sort();\n\n return {\n contextAttributes: attributes,\n parameters: parameters,\n shaderPrecisions: shaderPrecisions,\n extensions: extensions,\n extensionParameters: extensionParameters,\n unsupportedExtensions,\n };\n}\n\n/**\n * This function usually takes the most time to execute in all the sources, therefore we cache its result.\n *\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nexport function getWebGLContext(cache: Options[\"cache\"]) {\n if (cache.webgl) {\n return cache.webgl.context;\n }\n\n const canvas = document.createElement(\"canvas\");\n let context: CanvasContext | undefined;\n\n canvas.addEventListener(\n \"webglCreateContextError\",\n () => (context = undefined)\n );\n\n for (const type of [\"webgl\", \"experimental-webgl\"]) {\n try {\n context = canvas.getContext(type) as CanvasContext;\n } catch {\n // Ok, continue\n }\n if (context) {\n break;\n }\n }\n\n cache.webgl = { context };\n return context;\n}\n\n/**\n * https://developer.mozilla.org/en-US/docs/Web/API/WebGLShaderPrecisionFormat\n * https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getShaderPrecisionFormat\n * https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.12\n */\nfunction getShaderPrecision(\n gl: WebGLRenderingContext,\n shaderType: (typeof shaderTypes)[number],\n precisionType: (typeof precisionTypes)[number]\n) {\n const shaderPrecision = gl.getShaderPrecisionFormat(\n gl[shaderType],\n gl[precisionType]\n );\n return shaderPrecision\n ? [\n shaderPrecision.rangeMin,\n shaderPrecision.rangeMax,\n shaderPrecision.precision,\n ]\n : [];\n}\n\nfunction getConstantsFromPrototype<K>(obj: K): Array<Extract<keyof K, string>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const keys = Object.keys((obj as any).__proto__) as Array<keyof K>;\n return keys.filter(isConstantLike);\n}\n\nfunction isConstantLike<K>(key: K): key is Extract<K, string> {\n return typeof key === \"string\" && !key.match(/[^A-Z0-9_x]/);\n}\n\n/**\n * Some browsers print a console warning when the WEBGL_debug_renderer_info extension is requested.\n * JS Agent aims to avoid printing messages to console, so we avoid this extension in that browsers.\n */\nexport function shouldAvoidDebugRendererInfo(): boolean {\n return isGecko();\n}\n\n/**\n * Some browsers print a console warning when the WEBGL_polygon_mode extension is requested.\n * JS Agent aims to avoid printing messages to console, so we avoid this extension in that browsers.\n */\nexport function shouldAvoidPolygonModeExtensions(): boolean {\n return isChromium() || isWebKit();\n}\n\n/**\n * Some unknown browsers have no `getParameter` method\n */\nfunction isValidParameterGetter(gl: WebGLRenderingContext) {\n return typeof gl.getParameter === \"function\";\n}\n\nincludeComponent(\"webgl\", getWebGlBasics);\n","import { componentInterface, includeComponent } from '../../factory'\n\nexport default function getInstalledPlugins(): Promise<componentInterface> {\n const plugins: string[] = [];\n \n if (navigator.plugins) {\n for (let i = 0; i < navigator.plugins.length; i++) {\n const plugin = navigator.plugins[i];\n plugins.push([plugin.name, plugin.filename, plugin.description ].join(\"|\"));\n }\n }\n \n return new Promise((resolve) => {\n resolve(\n {\n 'plugins': plugins\n }\n );\n });\n }\n \n includeComponent('plugins', getInstalledPlugins);","import { componentInterface, includeComponent } from '../../factory';\nimport { hash } from '../../utils/hash';\n\n/**\n * Set of emojis to sample for fingerprinting\n * These emojis are chosen because they have significant rendering differences across platforms\n */\nconst TEST_EMOJIS = [\n '😀', // Basic smiling face - varies significantly\n '👨‍👩‍👧‍👦', // Family emoji - complex with multiple characters\n '🇺🇸', // Flag - rendered differently across platforms\n '🍎', // Apple - varies in color and style\n '🐼', // Panda - good variation in details\n '🚀', // Rocket - complex shape with details\n '🏳️‍🌈', // Rainbow flag - combination character\n '👍🏽', // Thumbs up with skin tone - tests skin tone rendering\n '❤️', // Heart with variation selector\n '🤦‍♂️', // Facepalm with gender - complex combination\n];\n\n/**\n * Font families to test for emoji rendering variations\n */\nconst TEST_FONTS = [\n 'Apple Color Emoji',\n 'Segoe UI Emoji',\n 'Segoe UI Symbol',\n 'Noto Color Emoji',\n 'Android Emoji',\n 'EmojiOne',\n 'Twemoji Mozilla',\n 'sans-serif' // Fallback\n];\n\n/**\n * Renders an emoji to a canvas and returns its pixel data\n * @param emoji The emoji to render\n * @param fontFamily Font family to use\n * @returns Uint8ClampedArray of pixels or null if rendering fails\n */\nfunction renderEmojiToCanvas(emoji: string, fontFamily: string): Uint8ClampedArray | null {\n try {\n // Create canvas and context\n const canvas = document.createElement('canvas');\n const size = 20; // Small size is enough for fingerprinting\n canvas.width = size;\n canvas.height = size;\n \n const ctx = canvas.getContext('2d');\n if (!ctx) return null;\n \n // Clear background\n ctx.fillStyle = 'white';\n ctx.fillRect(0, 0, size, size);\n \n // Draw emoji\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n ctx.fillStyle = 'black';\n ctx.font = `16px \"${fontFamily}\"`;\n ctx.fillText(emoji, size / 2, size / 2);\n \n // Get pixel data\n return ctx.getImageData(0, 0, size, size).data;\n } catch (e) {\n return null;\n }\n}\n\n/**\n * Creates a simplified fingerprint from pixel data by sampling\n * @param pixels Canvas pixel data\n * @returns Simplified representation for fingerprinting\n */\nfunction simplifyPixelData(pixels: Uint8ClampedArray): number[] {\n // Sample every 8th pixel for efficiency\n const simplified: number[] = [];\n \n for (let i = 0; i < pixels.length; i += 32) {\n // Use only RGB values (skip alpha)\n simplified.push(pixels[i], pixels[i + 1], pixels[i + 2]);\n }\n \n return simplified;\n}\n\n/**\n * Generates a fingerprint based on emoji rendering\n * @returns Promise that resolves to emoji fingerprint data\n */\nasync function getEmojiFingerprint(): Promise<componentInterface> {\n return new Promise((resolve) => {\n try {\n const results: Record<string, string> = {};\n let combinedData: number[] = [];\n \n // Test each emoji with the first available font\n TEST_EMOJIS.forEach((emoji, index) => {\n // Try each font until one works\n for (const font of TEST_FONTS) {\n const pixelData = renderEmojiToCanvas(emoji, font);\n \n if (pixelData) {\n const simplified = simplifyPixelData(pixelData);\n combinedData = [...combinedData, ...simplified];\n \n // Store individual emoji hash for detailed fingerprinting\n results[`emoji_${index}`] = hash(new Uint8Array(simplified).buffer).slice(0, 16);\n break; // Use first successful font\n }\n }\n });\n \n // Generate a combined hash for all emoji data\n const combinedHash = hash(new Uint8Array(combinedData).buffer);\n \n resolve({\n emojiFingerprintHash: combinedHash,\n emojiDetails: results,\n uniqueEmojisRendered: Object.keys(results).length\n });\n } catch (e) {\n // Fallback in case of any errors\n resolve({\n emojiFingerprintHash: 'unsupported',\n emojiDetails: {},\n uniqueEmojisRendered: 0\n });\n }\n });\n}\n\n// Register the component\nincludeComponent('emojiFingerprint', getEmojiFingerprint); ","import { componentInterface, includeComponent } from '../../factory'\n\nconst getMathInfo = async (): Promise<componentInterface> => {\n return {\n acos: Math.acos(0.5),\n asin: integrate(Math.asin, -1, 1, 97),\n atan: integrate(Math.atan, -1, 1, 97),\n cos: integrate(Math.cos, 0, Math.PI, 97),\n cosh: Math.cosh(9/7),\n e: Math.E,\n largeCos: Math.cos(1e20),\n largeSin: Math.sin(1e20),\n largeTan: Math.tan(1e20),\n log: Math.log(1000),\n pi: Math.PI,\n sin: integrate(Math.sin, -Math.PI, Math.PI, 97),\n sinh: integrate(Math.sinh, -9/7, 7/9, 97),\n sqrt: Math.sqrt(2),\n tan: integrate(Math.tan, 0, 2 * Math.PI, 97),\n tanh: integrate(Math.tanh, -9/7, 7/9, 97),\n }\n}\n\n/** This might be a little excessive, but I wasn't sure what number to pick for some of the\n * trigonometric functions. Using an integral here, so a few numbers are calculated. However,\n * I do this mainly for those integrals that sum up to a small value, otherwise there's no point.\n*/ \n\nconst integrate = (f: (x: number) => number, a: number, b: number, n: number): number => {\n const h = (b - a) / n;\n let sum = 0;\n for (let i = 0; i < n; i++) {\n const x = a + (i + 0.5) * h;\n sum += f(x);\n }\n return sum * h;\n};\n\nincludeComponent('math', getMathInfo);","export type MaybePromise<T> = Promise<T> | T\n\nexport function wait<T = void>(durationMs: number, resolveWith?: T): Promise<T> {\n return new Promise((resolve) => setTimeout(resolve, durationMs, resolveWith))\n}\n\n/**\n * Allows asynchronous actions and microtasks to happen.\n */\nfunction releaseEventLoop(): Promise<void> {\n // Don't use setTimeout because Chrome throttles it in some cases causing very long agent execution:\n // https://stackoverflow.com/a/6032591/1118709\n // https://github.com/chromium/chromium/commit/0295dd09496330f3a9103ef7e543fa9b6050409b\n // Reusing a MessageChannel object gives no noticeable benefits\n return new Promise((resolve) => {\n const channel = new MessageChannel()\n channel.port1.onmessage = () => resolve()\n channel.port2.postMessage(null)\n })\n}\n\nexport function requestIdleCallbackIfAvailable(fallbackTimeout: number, deadlineTimeout = Infinity): Promise<void> {\n const { requestIdleCallback } = window\n if (requestIdleCallback) {\n // The function `requestIdleCallback` loses the binding to `window` here.\n // `globalThis` isn't always equal `window` (see https://github.com/fingerprintjs/fingerprintjs/issues/683).\n // Therefore, an error can occur. `call(window,` prevents the error.\n return new Promise((resolve) => requestIdleCallback.call(window, () => resolve(), { timeout: deadlineTimeout }))\n } else {\n return wait(Math.min(fallbackTimeout, deadlineTimeout))\n }\n}\n\nexport function isPromise<T>(value: PromiseLike<T> | unknown): value is PromiseLike<T> {\n return !!value && typeof (value as PromiseLike<T>).then === 'function'\n}\n\n/**\n * Calls a maybe asynchronous function without creating microtasks when the function is synchronous.\n * Catches errors in both cases.\n *\n * If just you run a code like this:\n * ```\n * console.time('Action duration')\n * await action()\n * console.timeEnd('Action duration')\n * ```\n * The synchronous function time can be measured incorrectly because another microtask may run before the `await`\n * returns the control back to the code.\n */\nexport function awaitIfAsync<TResult, TError = unknown>(\n action: () => MaybePromise<TResult>,\n callback: (...args: [success: true, result: TResult] | [success: false, error: TError]) => unknown,\n): void {\n try {\n const returnedValue = action()\n if (isPromise(returnedValue)) {\n returnedValue.then(\n (result) => callback(true, result),\n (error: TError) => callback(false, error),\n )\n } else {\n callback(true, returnedValue)\n }\n } catch (error) {\n callback(false, error as TError)\n }\n}\n\n/**\n * If you run many synchronous tasks without using this function, the JS main loop will be busy and asynchronous tasks\n * (e.g. completing a network request, rendering the page) won't be able to happen.\n * This function allows running many synchronous tasks such way that asynchronous tasks can run too in background.\n */\nexport async function mapWithBreaks<T, U>(\n items: readonly T[],\n callback: (item: T, index: number) => U,\n loopReleaseInterval = 16,\n): Promise<U[]> {\n const results = Array<U>(items.length)\n let lastLoopReleaseTime = Date.now()\n\n for (let i = 0; i < items.length; ++i) {\n results[i] = callback(items[i], i)\n\n const now = Date.now()\n if (now >= lastLoopReleaseTime + loopReleaseInterval) {\n lastLoopReleaseTime = now\n await releaseEventLoop()\n }\n }\n\n return results\n}\n\n/**\n * Makes the given promise never emit an unhandled promise rejection console warning.\n * The promise will still pass errors to the next promises.\n * Returns the input promise for convenience.\n *\n * Otherwise, promise emits a console warning unless it has a `catch` listener.\n */\nexport function suppressUnhandledRejectionWarning<T extends PromiseLike<unknown>>(promise: T): T {\n promise.then(undefined, () => undefined)\n return promise\n}\n","import { MaybePromise, wait } from './async'\nimport { parseSimpleCssSelector } from './data'\n\n/**\n * Creates and keeps an invisible iframe while the given function runs.\n * The given function is called when the iframe is loaded and has a body.\n * The iframe allows to measure DOM sizes inside itself.\n *\n * Notice: passing an initial HTML code doesn't work in IE.\n *\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nexport async function withIframe<T>(\n action: (iframe: HTMLIFrameElement, iWindow: typeof window) => MaybePromise<T>,\n initialHtml?: string,\n domPollInterval = 50,\n): Promise<T> {\n const d = document\n\n // document.body can be null while the page is loading\n while (!d.body) {\n await wait(domPollInterval)\n }\n\n const iframe = d.createElement('iframe')\n\n try {\n await new Promise<void>((_resolve, _reject) => {\n let isComplete = false\n const resolve = () => {\n isComplete = true\n _resolve()\n }\n const reject = (error: unknown) => {\n isComplete = true\n _reject(error)\n }\n\n iframe.onload = resolve\n iframe.onerror = reject\n const { style } = iframe\n style.setProperty('display', 'block', 'important') // Required for browsers to calculate the layout\n style.position = 'absolute'\n style.top = '0'\n style.left = '0'\n style.visibility = 'hidden'\n if (initialHtml && 'srcdoc' in iframe) {\n iframe.srcdoc = initialHtml\n } else {\n iframe.src = 'about:blank'\n }\n d.body.appendChild(iframe)\n\n // WebKit in WeChat doesn't fire the iframe's `onload` for some reason.\n // This code checks for the loading state manually.\n // See https://github.com/fingerprintjs/fingerprintjs/issues/645\n const checkReadyState = () => {\n // The ready state may never become 'complete' in Firefox despite the 'load' event being fired.\n // So an infinite setTimeout loop can happen without this check.\n // See https://github.com/fingerprintjs/fingerprintjs/pull/716#issuecomment-986898796\n if (isComplete) {\n return\n }\n\n // Make sure iframe.contentWindow and iframe.contentWindow.document are both loaded\n // The contentWindow.document can miss in JSDOM (https://github.com/jsdom/jsdom).\n if (iframe.contentWindow?.document?.readyState === 'complete') {\n resolve()\n } else {\n setTimeout(checkReadyState, 10)\n }\n }\n checkReadyState()\n })\n\n while (!iframe.contentWindow?.document?.body) {\n await wait(domPollInterval)\n }\n\n return await action(iframe, iframe.contentWindow as typeof window)\n } finally {\n iframe.parentNode?.removeChild(iframe)\n }\n}\n\n/**\n * Creates a DOM element that matches the given selector.\n * Only single element selector are supported (without operators like space, +, >, etc).\n */\nexport function selectorToElement(selector: string): HTMLElement {\n const [tag, attributes] = parseSimpleCssSelector(selector)\n const element = document.createElement(tag ?? 'div')\n for (const name of Object.keys(attributes)) {\n const value = attributes[name].join(' ')\n // Changing the `style` attribute can cause a CSP error, therefore we change the `style.cssText` property.\n // https://github.com/fingerprintjs/fingerprintjs/issues/733\n if (name === 'style') {\n addStyleString(element.style, value)\n } else {\n element.setAttribute(name, value)\n }\n }\n return element\n}\n\n/**\n * Adds CSS styles from a string in such a way that doesn't trigger a CSP warning (unsafe-inline or unsafe-eval)\n */\nexport function addStyleString(style: CSSStyleDeclaration, source: string): void {\n // We don't use `style.cssText` because browsers must block it when no `unsafe-eval` CSP is presented: https://csplite.com/csp145/#w3c_note\n // Even though the browsers ignore this standard, we don't use `cssText` just in case.\n for (const property of source.split(';')) {\n const match = /^\\s*([\\w-]+)\\s*:\\s*(.+?)(\\s*!([\\w-]+))?\\s*$/.exec(property)\n if (match) {\n const [, name, value, , priority] = match\n style.setProperty(name, value, priority || '') // The last argument can't be undefined in IE11\n }\n }\n}\n\n/**\n * Returns true if the code runs in an iframe, and any parent page's origin doesn't match the current origin\n */\nexport function isAnyParentCrossOrigin(): boolean {\n let currentWindow: Window = window\n\n for (;;) {\n const parentWindow = currentWindow.parent\n if (!parentWindow || parentWindow === currentWindow) {\n return false // The top page is reached\n }\n\n try {\n if (parentWindow.location.origin !== currentWindow.location.origin) {\n return true\n }\n } catch (error) {\n // The error is thrown when `origin` is accessed on `parentWindow.location` when the parent is cross-origin\n if (error instanceof Error && error.name === 'SecurityError') {\n return true\n }\n throw error\n }\n\n currentWindow = parentWindow\n }\n}\n","import { includeComponent } from \"../../factory\";\n\nimport { selectorToElement } from \"../../utils/dom\";\nimport { countTruthy } from \"../../utils/data\";\nimport { wait } from \"../../utils/async\";\nimport { isAndroid, isWebKit } from \"../../utils/browser_\";\nimport { detectBrowser } from \"../system/browser\";\n\n// Floating-point calculations (Math.sin(), Math.log()) produce slightly different results across CPUs due to:\n// Extremely hard to spoof without emulating a different CPU.\n// function getCPUFingerprint(): any {\n// return {\n// sin1: Math.sin(1),\n// log10: Math.log(10),\n// tanh05: Math.tanh(0.5),\n// };\n// }\n\nconst enum SpecialFingerprint {\n /** The browser doesn't support AudioContext or baseLatency */\n NotSupported = -1,\n /** Entropy source is disabled because of console warnings */\n Disabled = -2,\n}\n\nfunction getAudioContextBaseLatency(): any {\n // The signal emits warning in Chrome and Firefox, therefore it is enabled on Safari where it doesn't produce warning\n // and on Android where it's less visible\n const isAllowedPlatform = isAndroid() || isWebKit();\n if (!isAllowedPlatform) {\n return SpecialFingerprint.Disabled;\n }\n\n if (!window.AudioContext) {\n return SpecialFingerprint.NotSupported;\n }\n return new AudioContext().baseLatency ?? SpecialFingerprint.NotSupported;\n}\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/@media/color-gamut\n */\nfunction getColorGamut(): any {\n // rec2020 includes p3 and p3 includes srgb\n for (const gamut of [\"rec2020\", \"p3\", \"srgb\"] as const) {\n if (matchMedia(`(color-gamut: ${gamut})`).matches) {\n return gamut;\n }\n }\n return undefined;\n}\n\nfunction areColorsForced(): any {\n if (doesMatch(\"active\")) {\n return true;\n }\n if (doesMatch(\"none\")) {\n return false;\n }\n return undefined;\n}\n\nfunction doesMatch(value: string) {\n return matchMedia(`(forced-colors: ${value})`).matches;\n}\n\nconst maxValueToCheck = 100;\n\n/**\n * If the display is monochrome (e.g. black&white), the value will be ≥0 and will mean the number of bits per pixel.\n * If the display is not monochrome, the returned value will be 0.\n * If the browser doesn't support this feature, the returned value will be undefined.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/@media/monochrome\n */\nfunction getMonochromeDepth(): any {\n if (!matchMedia(\"(min-monochrome: 0)\").matches) {\n // The media feature isn't supported by the browser\n return undefined;\n }\n\n // A variation of binary search algorithm can be used here.\n // But since expected values are very small (≤10), there is no sense in adding the complexity.\n for (let i = 0; i <= maxValueToCheck; ++i) {\n if (matchMedia(`(max-monochrome: ${i})`).matches) {\n return i;\n }\n }\n\n throw new Error(\"Too high value\");\n}\n\nfunction getOsCpu(): any {\n return (navigator as any).oscpu;\n}\n\n/**\n * Checks for browser-specific (not engine specific) global variables to tell browsers with the same engine apart.\n * Only somewhat popular browsers are considered.\n */\nexport function getVendorFlavors(): any {\n const flavors: string[] = [];\n\n for (const key of [\n // Blink and some browsers on iOS\n \"chrome\",\n\n // Safari on macOS\n \"safari\",\n\n // Chrome on iOS (checked in 85 on 13 and 87 on 14)\n \"__crWeb\",\n \"__gCrWeb\",\n\n // Yandex Browser on iOS, macOS and Android (checked in 21.2 on iOS 14, macOS and Android)\n \"yandex\",\n\n // Yandex Browser on iOS (checked in 21.2 on 14)\n \"__yb\",\n \"__ybro\",\n\n // Firefox on iOS (checked in 32 on 14)\n \"__firefox__\",\n\n // Edge on iOS (checked in 46 on 14)\n \"__edgeTrackingPreventionStatistics\",\n \"webkit\",\n\n // Opera Touch on iOS (checked in 2.6 on 14)\n \"oprt\",\n\n // Samsung Internet on Android (checked in 11.1)\n \"samsungAr\",\n\n // UC Browser on Android (checked in 12.10 and 13.0)\n \"ucweb\",\n \"UCShellJava\",\n\n // Puffin on Android (checked in 9.0)\n \"puffinDevice\",\n\n // UC on iOS and Opera on Android have no specific global variables\n // Edge for Android isn't checked\n ]) {\n const value = (window as unknown as Record<string, unknown>)[key];\n if (value && typeof value === \"object\") {\n flavors.push(key);\n }\n }\n\n const sortedVendorFlavors = flavors.sort();\n\n // If no vendor flavor is detected, default to use the browser name\n if (sortedVendorFlavors.length > 0) {\n return sortedVendorFlavors;\n } else {\n const { name: browsername } = detectBrowser();\n return [browsername];\n }\n}\n\ntype Filters = Record<string, string[]>;\n\n/**\n * Only single element selector are supported (no operators like space, +, >, etc).\n * `embed` and `position: fixed;` will be considered as blocked anyway because it always has no offsetParent.\n * Avoid `iframe` and anything with `[src=]` because they produce excess HTTP requests.\n *\n * The \"inappropriate\" selectors are obfuscated. See https://github.com/fingerprintjs/fingerprintjs/issues/734.\n * A function is used instead of a plain object to help tree-shaking.\n *\n * The function code is generated automatically. See docs/content_blockers.md to learn how to make the list.\n */\nexport function getFilters(): Filters {\n const fromB64 = atob; // Just for better minification\n\n return {\n abpIndo: [\n \"#Iklan-Melayang\",\n \"#Kolom-Iklan-728\",\n \"#SidebarIklan-wrapper\",\n '[title=\"ALIENBOLA\" i]',\n fromB64(\"I0JveC1CYW5uZXItYWRz\"),\n ],\n abpvn: [\n \".quangcao\",\n \"#mobileCatfish\",\n fromB64(\"LmNsb3NlLWFkcw==\"),\n '[id^=\"bn_bottom_fixed_\"]',\n \"#pmadv\",\n ],\n adBlockFinland: [\n \".mainostila\",\n fromB64(\"LnNwb25zb3JpdA==\"),\n \".ylamainos\",\n fromB64(\"YVtocmVmKj0iL2NsaWNrdGhyZ2guYXNwPyJd\"),\n fromB64(\"YVtocmVmXj0iaHR0cHM6Ly9hcHAucmVhZHBlYWsuY29tL2FkcyJd\"),\n ],\n adBlockPersian: [\n \"#navbar_notice_50\",\n \".kadr\",\n 'TABLE[width=\"140px\"]',\n \"#divAgahi\",\n fromB64(\"YVtocmVmXj0iaHR0cDovL2cxLnYuZndtcm0ubmV0L2FkLyJd\"),\n ],\n adBlockWarningRemoval: [\n \"#adblock-honeypot\",\n \".adblocker-root\",\n \".wp_adblock_detect\",\n fromB64(\"LmhlYWRlci1ibG9ja2VkLWFk\"),\n fromB64(\"I2FkX2Jsb2NrZXI=\"),\n ],\n adGuardAnnoyances: [\n \".hs-sosyal\",\n \"#cookieconsentdiv\",\n 'div[class^=\"app_gdpr\"]',\n \".as-oil\",\n '[data-cypress=\"soft-push-notification-modal\"]',\n ],\n adGuardBase: [\n \".BetterJsPopOverlay\",\n fromB64(\"I2FkXzMwMFgyNTA=\"),\n fromB64(\"I2Jhbm5lcmZsb2F0MjI=\"),\n fromB64(\"I2NhbXBhaWduLWJhbm5lcg==\"),\n fromB64(\"I0FkLUNvbnRlbnQ=\"),\n ],\n adGuardChinese: [\n fromB64(\"LlppX2FkX2FfSA==\"),\n fromB64(\"YVtocmVmKj0iLmh0aGJldDM0LmNvbSJd\"),\n \"#widget-quan\",\n fromB64(\"YVtocmVmKj0iLzg0OTkyMDIwLnh5eiJd\"),\n fromB64(\"YVtocmVmKj0iLjE5NTZobC5jb20vIl0=\"),\n ],\n adGuardFrench: [\n \"#pavePub\",\n fromB64(\"LmFkLWRlc2t0b3AtcmVjdGFuZ2xl\"),\n \".mobile_adhesion\",\n \".widgetadv\",\n fromB64(\"LmFkc19iYW4=\"),\n ],\n adGuardGerman: ['aside[data-portal-id=\"leaderboard\"]'],\n adGuardJapanese: [\n \"#kauli_yad_1\",\n fromB64(\"YVtocmVmXj0iaHR0cDovL2FkMi50cmFmZmljZ2F0ZS5uZXQvIl0=\"),\n fromB64(\"Ll9wb3BJbl9pbmZpbml0ZV9hZA==\"),\n fromB64(\"LmFkZ29vZ2xl\"),\n fromB64(\"Ll9faXNib29zdFJldHVybkFk\"),\n ],\n adGuardMobile: [\n fromB64(\"YW1wLWF1dG8tYWRz\"),\n fromB64(\"LmFtcF9hZA==\"),\n 'amp-embed[type=\"24smi\"]',\n \"#mgid_iframe1\",\n fromB64(\"I2FkX2ludmlld19hcmVh\"),\n ],\n adGuardRussian: [\n fromB64(\"YVtocmVmXj0iaHR0cHM6Ly9hZC5sZXRtZWFkcy5jb20vIl0=\"),\n fromB64(\"LnJlY2xhbWE=\"),\n 'div[id^=\"smi2adblock\"]',\n fromB64(\"ZGl2W2lkXj0iQWRGb3hfYmFubmVyXyJd\"),\n \"#psyduckpockeball\",\n ],\n adGuardSocial: [\n fromB64(\"YVtocmVmXj0iLy93d3cuc3R1bWJsZXVwb24uY29tL3N1Ym1pdD91cmw9Il0=\"),\n fromB64(\"YVtocmVmXj0iLy90ZWxlZ3JhbS5tZS9zaGFyZS91cmw/Il0=\"),\n \".etsy-tweet\",\n \"#inlineShare\",\n \".popup-social\",\n ],\n adGuardSpanishPortuguese: [\n \"#barraPublicidade\",\n \"#Publicidade\",\n \"#publiEspecial\",\n \"#queTooltip\",\n \".cnt-publi\",\n ],\n adGuardTrackingProtection: [\n \"#qoo-counter\",\n fromB64(\"YVtocmVmXj0iaHR0cDovL2NsaWNrLmhvdGxvZy5ydS8iXQ==\"),\n fromB64(\"YVtocmVmXj0iaHR0cDovL2hpdGNvdW50ZXIucnUvdG9wL3N0YXQucGhwIl0=\"),\n fromB64(\"YVtocmVmXj0iaHR0cDovL3RvcC5tYWlsLnJ1L2p1bXAiXQ==\"),\n \"#top100counter\",\n ],\n adGuardTurkish: [\n \"#backkapat\",\n fromB64(\"I3Jla2xhbWk=\"),\n fromB64(\"YVtocmVmXj0iaHR0cDovL2Fkc2Vydi5vbnRlay5jb20udHIvIl0=\"),\n fromB64(\"YVtocmVmXj0iaHR0cDovL2l6bGVuemkuY29tL2NhbXBhaWduLyJd\"),\n fromB64(\"YVtocmVmXj0iaHR0cDovL3d3dy5pbnN0YWxsYWRzLm5ldC8iXQ==\"),\n ],\n bulgarian: [\n fromB64(\"dGQjZnJlZW5ldF90YWJsZV9hZHM=\"),\n \"#ea_intext_div\",\n \".lapni-pop-over\",\n \"#xenium_hot_offers\",\n ],\n easyList: [\n \".yb-floorad\",\n fromB64(\"LndpZGdldF9wb19hZHNfd2lkZ2V0\"),\n fromB64(\"LnRyYWZmaWNqdW5reS1hZA==\"),\n \".textad_headline\",\n fromB64(\"LnNwb25zb3JlZC10ZXh0LWxpbmtz\"),\n ],\n easyListChina: [\n fromB64(\"LmFwcGd1aWRlLXdyYXBbb25jbGljayo9ImJjZWJvcy5jb20iXQ==\"),\n fromB64(\"LmZyb250cGFnZUFkdk0=\"),\n \"#taotaole\",\n \"#aafoot.top_box\",\n \".cfa_popup\",\n ],\n easyListCookie: [\n \".ezmob-footer\",\n \".cc-CookieWarning\",\n \"[data-cookie-number]\",\n fromB64(\"LmF3LWNvb2tpZS1iYW5uZXI=\"),\n \".sygnal24-gdpr-modal-wrap\",\n ],\n easyListCzechSlovak: [\n \"#onlajny-stickers\",\n fromB64(\"I3Jla2xhbW5pLWJveA==\"),\n fromB64(\"LnJla2xhbWEtbWVnYWJvYXJk\"),\n \".sklik\",\n fromB64(\"W2lkXj0ic2tsaWtSZWtsYW1hIl0=\"),\n ],\n easyListDutch: [\n fromB64(\"I2FkdmVydGVudGll\"),\n fromB64(\"I3ZpcEFkbWFya3RCYW5uZXJCbG9jaw==\"),\n \".adstekst\",\n fromB64(\"YVtocmVmXj0iaHR0cHM6Ly94bHR1YmUubmwvY2xpY2svIl0=\"),\n \"#semilo-lrectangle\",\n ],\n easyListGermany: [\n \"#SSpotIMPopSlider\",\n fromB64(\"LnNwb25zb3JsaW5rZ3J1ZW4=\"),\n fromB64(\"I3dlcmJ1bmdza3k=\"),\n fromB64(\"I3Jla2xhbWUtcmVjaHRzLW1pdHRl\"),\n fromB64(\"YVtocmVmXj0iaHR0cHM6Ly9iZDc0Mi5jb20vIl0=\"),\n ],\n easyListItaly: [\n fromB64(\"LmJveF9hZHZfYW5udW5jaQ==\"),\n \".sb-box-pubbliredazionale\",\n fromB64(\"YVtocmVmXj0iaHR0cDovL2FmZmlsaWF6aW9uaWFkcy5zbmFpLml0LyJd\"),\n fromB64(\"YVtocmVmXj0iaHR0cHM6Ly9hZHNlcnZlci5odG1sLml0LyJd\"),\n fromB64(\"YVtocmVmXj0iaHR0cHM6Ly9hZmZpbGlhemlvbmlhZHMuc25haS5pdC8iXQ==\"),\n ],\n easyListLithuania: [\n fromB64(\"LnJla2xhbW9zX3RhcnBhcw==\"),\n fromB64(\"LnJla2xhbW9zX251b3JvZG9z\"),\n fromB64(\"aW1nW2FsdD0iUmVrbGFtaW5pcyBza3lkZWxpcyJd\"),\n fromB64(\"aW1nW2FsdD0iRGVkaWt1b3RpLmx0IHNlcnZlcmlhaSJd\"),\n fromB64(\"aW1nW2FsdD0iSG9zdGluZ2FzIFNlcnZlcmlhaS5sdCJd\"),\n ],\n estonian: [fromB64(\"QVtocmVmKj0iaHR0cDovL3BheTRyZXN1bHRzMjQuZXUiXQ==\")],\n fanboyAnnoyances: [\n \"#ac-lre-player\",\n \".navigate-to-top\",\n \"#subscribe_popup\",\n \".newsletter_holder\",\n \"#back-top\",\n ],\n fanboyAntiFacebook: [\".util-bar-module-firefly-visible\"],\n fanboyEnhancedTrackers: [\n \".open.pushModal\",\n \"#issuem-leaky-paywall-articles-zero-remaining-nag\",\n \"#sovrn_container\",\n 'div[class$=\"-hide\"][zoompage-fontsize][style=\"display: block;\"]',\n \".BlockNag__Card\",\n ],\n fanboySocial: [\n \"#FollowUs\",\n \"#meteored_share\",\n \"#social_follow\",\n \".article-sharer\",\n \".community__social-desc\",\n ],\n frellwitSwedish: [\n fromB64(\"YVtocmVmKj0iY2FzaW5vcHJvLnNlIl1bdGFyZ2V0PSJfYmxhbmsiXQ==\"),\n fromB64(\"YVtocmVmKj0iZG9rdG9yLXNlLm9uZWxpbmsubWUiXQ==\"),\n \"article.category-samarbete\",\n fromB64(\"ZGl2LmhvbGlkQWRz\"),\n \"ul.adsmodern\",\n ],\n greekAdBlock: [\n fromB64(\"QVtocmVmKj0iYWRtYW4ub3RlbmV0LmdyL2NsaWNrPyJd\"),\n fromB64(\"QVtocmVmKj0iaHR0cDovL2F4aWFiYW5uZXJzLmV4b2R1cy5nci8iXQ==\"),\n fromB64(\n \"QVtocmVmKj0iaHR0cDovL2ludGVyYWN0aXZlLmZvcnRobmV0LmdyL2NsaWNrPyJd\"\n ),\n \"DIV.agores300\",\n \"TABLE.advright\",\n ],\n hungarian: [\n \"#cemp_doboz\",\n \".optimonk-iframe-container\",\n fromB64(\"LmFkX19tYWlu\"),\n fromB64(\"W2NsYXNzKj0iR29vZ2xlQWRzIl0=\"),\n \"#hirdetesek_box\",\n ],\n iDontCareAboutCookies: [\n '.alert-info[data-block-track*=\"CookieNotice\"]',\n \".ModuleTemplateCookieIndicator\",\n \".o--cookies--container\",\n \"#cookies-policy-sticky\",\n \"#stickyCookieBar\",\n ],\n icelandicAbp: [\n fromB64(\n \"QVtocmVmXj0iL2ZyYW1ld29yay9yZXNvdXJjZXMvZm9ybXMvYWRzLmFzcHgiXQ==\"\n ),\n ],\n latvian: [\n fromB64(\n \"YVtocmVmPSJodHRwOi8vd3d3LnNhbGlkemluaS5sdi8iXVtzdHlsZT0iZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMjBweDsgaGVpZ2h0O\" +\n \"iA0MHB4OyBvdmVyZmxvdzogaGlkZGVuOyBwb3NpdGlvbjogcmVsYXRpdmU7Il0=\"\n ),\n fromB64(\n \"YVtocmVmPSJodHRwOi8vd3d3LnNhbGlkemluaS5sdi8iXVtzdHlsZT0iZGlzcGxheTogYmxvY2s7IHdpZHRoOiA4OHB4OyBoZWlnaHQ6I\" +\n \"DMxcHg7IG92ZXJmbG93OiBoaWRkZW47IHBvc2l0aW9uOiByZWxhdGl2ZTsiXQ==\"\n ),\n ],\n listKr: [\n fromB64(\"YVtocmVmKj0iLy9hZC5wbGFuYnBsdXMuY28ua3IvIl0=\"),\n fromB64(\"I2xpdmVyZUFkV3JhcHBlcg==\"),\n fromB64(\"YVtocmVmKj0iLy9hZHYuaW1hZHJlcC5jby5rci8iXQ==\"),\n fromB64(\"aW5zLmZhc3R2aWV3LWFk\"),\n \".revenue_unit_item.dable\",\n ],\n listeAr: [\n fromB64(\"LmdlbWluaUxCMUFk\"),\n \".right-and-left-sponsers\",\n fromB64(\"YVtocmVmKj0iLmFmbGFtLmluZm8iXQ==\"),\n fromB64(\"YVtocmVmKj0iYm9vcmFxLm9yZyJd\"),\n fromB64(\"YVtocmVmKj0iZHViaXp6bGUuY29tL2FyLz91dG1fc291cmNlPSJd\"),\n ],\n listeFr: [\n fromB64(\"YVtocmVmXj0iaHR0cDovL3Byb21vLnZhZG9yLmNvbS8iXQ==\"),\n fromB64(\"I2FkY29udGFpbmVyX3JlY2hlcmNoZQ==\"),\n fromB64(\"YVtocmVmKj0id2Vib3JhbWEuZnIvZmNnaS1iaW4vIl0=\"),\n \".site-pub-interstitiel\",\n 'div[id^=\"crt-\"][data-criteo-id]',\n ],\n officialPolish: [\n \"#ceneo-placeholder-ceneo-12\",\n fromB64(\"W2hyZWZePSJodHRwczovL2FmZi5zZW5kaHViLnBsLyJd\"),\n fromB64(\n \"YVtocmVmXj0iaHR0cDovL2Fkdm1hbmFnZXIudGVjaGZ1bi5wbC9yZWRpcmVjdC8iXQ==\"\n ),\n fromB64(\"YVtocmVmXj0iaHR0cDovL3d3dy50cml6ZXIucGwvP3V0bV9zb3VyY2UiXQ==\"),\n fromB64(\"ZGl2I3NrYXBpZWNfYWQ=\"),\n ],\n ro: [\n fromB64(\"YVtocmVmXj0iLy9hZmZ0cmsuYWx0ZXgucm8vQ291bnRlci9DbGljayJd\"),\n fromB64(\n \"YVtocmVmXj0iaHR0cHM6Ly9ibGFja2ZyaWRheXNhbGVzLnJvL3Ryay9zaG9wLyJd\"\n ),\n fromB64(\n \"YVtocmVmXj0iaHR0cHM6Ly9ldmVudC4ycGVyZm9ybWFudC5jb20vZXZlbnRzL2NsaWNrIl0=\"\n ),\n fromB64(\"YVtocmVmXj0iaHR0cHM6Ly9sLnByb2ZpdHNoYXJlLnJvLyJd\"),\n 'a[href^=\"/url/\"]',\n ],\n ruAd: [\n fromB64(\"YVtocmVmKj0iLy9mZWJyYXJlLnJ1LyJd\"),\n fromB64(\"YVtocmVmKj0iLy91dGltZy5ydS8iXQ==\"),\n fromB64(\"YVtocmVmKj0iOi8vY2hpa2lkaWtpLnJ1Il0=\"),\n \"#pgeldiz\",\n \".yandex-rtb-block\",\n ],\n thaiAds: [\n \"a[href*=macau-uta-popup]\",\n fromB64(\"I2Fkcy1nb29nbGUtbWlkZGxlX3JlY3RhbmdsZS1ncm91cA==\"),\n fromB64(\"LmFkczMwMHM=\"),\n \".bumq\",\n \".img-kosana\",\n ],\n webAnnoyancesUltralist: [\n \"#mod-social-share-2\",\n \"#social-tools\",\n fromB64(\"LmN0cGwtZnVsbGJhbm5lcg==\"),\n \".zergnet-recommend\",\n \".yt.btn-link.btn-md.btn\",\n ],\n };\n}\n\n/**\n * The order of the returned array means nothing (it's always sorted alphabetically).\n *\n * Notice that the source is slightly unstable.\n * Safari provides a 2-taps way to disable all content blockers on a page temporarily.\n * Also content blockers can be disabled permanently for a domain, but it requires 4 taps.\n * So empty array shouldn't be treated as \"no blockers\", it should be treated as \"no signal\".\n * If you are a website owner, don't make your visitors want to disable content blockers.\n */\nasync function getDomBlockers(): Promise<any> {\n if (!isApplicable()) {\n return undefined;\n }\n\n const filters = getFilters();\n const filterNames = Object.keys(filters) as Array<keyof typeof filters>;\n const allSelectors = ([] as string[]).concat(\n ...filterNames.map((filterName) => filters[filterName])\n );\n const blockedSelectors = await getBlockedSelectors(allSelectors);\n\n const activeBlockers = filterNames.filter((filterName) => {\n const selectors = filters[filterName];\n const blockedCount = countTruthy(\n selectors.map((selector) => blockedSelectors[selector])\n );\n return blockedCount > selectors.length * 0.6;\n });\n activeBlockers.sort();\n\n return activeBlockers;\n}\n\nfunction isApplicable(): boolean {\n // Safari (desktop and mobile) and all Android browsers keep content blockers in both regular and private mode\n return isWebKit() || isAndroid();\n}\n\nasync function getBlockedSelectors<T extends string>(\n selectors: readonly T[]\n): Promise<{ [K in T]?: true }> {\n const d = document;\n const root = d.createElement(\"div\");\n const elements = new Array<HTMLElement>(selectors.length);\n const blockedSelectors: { [K in T]?: true } = {}; // Set() isn't used just in case somebody need older browser support\n\n forceShow(root);\n\n // First create all elements that can be blocked. If the DOM steps below are done in a single cycle,\n // browser will alternate tree modification and layout reading, that is very slow.\n for (let i = 0; i < selectors.length; ++i) {\n const element = selectorToElement(selectors[i]);\n if (element.tagName === \"DIALOG\") {\n (element as HTMLDialogElement).show();\n }\n const holder = d.createElement(\"div\"); // Protects from unwanted effects of `+` and `~` selectors of filters\n forceShow(holder);\n holder.appendChild(element);\n root.appendChild(holder);\n elements[i] = element;\n }\n\n // document.body can be null while the page is loading\n while (!d.body) {\n await wait(50);\n }\n d.body.appendChild(root);\n\n try {\n // Then check which of the elements are blocked\n for (let i = 0; i < selectors.length; ++i) {\n if (!elements[i].offsetParent) {\n blockedSelectors[selectors[i]] = true;\n }\n }\n } finally {\n // Then remove the elements\n root.parentNode?.removeChild(root);\n }\n\n return blockedSelectors;\n}\n\nfunction forceShow(element: HTMLElement) {\n element.style.setProperty(\"visibility\", \"hidden\", \"important\");\n element.style.setProperty(\"display\", \"block\", \"important\");\n}\n\nincludeComponent(\"domBlockers\", getDomBlockers);\nincludeComponent(\"vendorFlavour\", getVendorFlavors);\nincludeComponent(\"monochrome\", getMonochromeDepth);\nincludeComponent(\"forcedColors\", areColorsForced);\nincludeComponent(\"colorGamut\", getColorGamut);\nincludeComponent(\"osCpu\", getOsCpu);\nincludeComponent(\"audioLatency\", getAudioContextBaseLatency);\n\n","import { getFingerprint } from './modules/fp'\nimport { detectTorBrowser } from './modules/tor'\nimport { detectIncognito } from './modules/incognito'\nimport { botDetection } from './modules/bot'\nimport { detectBrowser } from './components/system/browser'\nimport { getOs } from './modules/os'\nimport { getDeviceDetails } from './modules/device'\nimport { getBrowserDetails } from './modules/browserDetails'\nimport './components'\n\nexport { getFingerprint, detectTorBrowser, detectIncognito, botDetection, detectBrowser, getOs, getDeviceDetails, getBrowserDetails }\n\ninterface SdkInfo {\n name: string;\n version: string;\n}\n\nexport const buildInitialPayload = async (request_id: string, sdkInfo: SdkInfo) => {\n const [\n fingerprint,\n torResult,\n botResult,\n incognito,\n osResult,\n deviceDetails,\n browserDetails,\n ] = await fetchModules();\n\n return {\n request_id,\n device: {\n fingerprint_id: fingerprint.hash,\n type: \"web\",\n os: deviceDetails.deviceOs,\n os_version: osResult.version,\n raw_device_data: fingerprint.data,\n browserDetails: browserDetails,\n bot: botResult,\n tampering: deviceDetails.tampering,\n incognito: incognito,\n tor: torResult,\n },\n sdk: {\n name: sdkInfo?.name,\n version: sdkInfo?.version\n }\n };\n};\n\nexport async function fetchModules() {\n return await Promise.all([\n getFingerprint(),\n detectTorBrowser(),\n botDetection(),\n detectIncognito(),\n getOs(),\n getDeviceDetails(),\n getBrowserDetails(),\n ]);\n}\n","import { GingerClientError, FieldMetrics, FillEnum, FillMethod, pageVisibility, Field } from \"../core\";\n\ninterface TrackedFieldMetrics extends FieldMetrics {\n readonly element: HTMLInputElement | HTMLTextAreaElement;\n}\n\ninterface EventConfig {\n readonly pauseThresholdMs: number;\n}\n\nconst { getCount, addListener, removeListener } = pageVisibility();\n\nclass EventTracker {\n private static readonly DEFAULT_CONFIG: EventConfig = {\n pauseThresholdMs: 1500,\n };\n\n private readonly config: EventConfig;\n private isInitialized = false;\n private readonly fields: TrackedFieldMetrics[] = [];\n private readonly trackedFieldIds = new Set<string>();\n\n constructor(config: Partial<EventConfig> = {}) {\n this.config = { ...EventTracker.DEFAULT_CONFIG, ...config };\n addListener();\n }\n\n /**\n * Initialize tracking for multiple form fields\n */\n public initializeTracking(fields: readonly Field[]): void {\n const newFields = fields.filter(\n (field) => !this.trackedFieldIds.has(field.id)\n );\n\n newFields.forEach((field) => this.trackField(field));\n this.isInitialized = true;\n }\n\n /**\n * Get all tracked metrics data (excluding DOM elements)\n */\n get metrics(): FieldMetrics[] {\n this.ensureInitialized();\n return this.fields.map(({ element, ...field }) => field);\n }\n\n /**\n * Remove tracking from specific field or all fields\n */\n public removeTracking(fieldId?: string): void {\n if (fieldId) {\n this.removeFieldTracking(fieldId);\n } else {\n this.removeAllTracking();\n }\n }\n\n // Private implementation methods\n\n private trackField(field: Field): void {\n const { id, ltm } = field;\n const element = this.getValidElement(id);\n const fieldMetric = this.createFieldMetric(id, element, ltm);\n\n this.fields.push(fieldMetric);\n this.trackedFieldIds.add(id);\n\n // Use bound method to maintain context\n const boundHandler = this.createInputHandler(fieldMetric);\n element.addEventListener(\"input\", boundHandler);\n }\n\n private getValidElement(id: string): HTMLInputElement | HTMLTextAreaElement {\n const element = document.getElementById(id);\n\n if (!element) {\n throw new GingerClientError(\n `Element with ID \"${id}\" was not found in the DOM. Please ensure the ID is correctly assigned to an input element.`\n );\n }\n\n if (!this.isValidInputElement(element)) {\n throw new GingerClientError(\n `Element with ID \"${id}\" must be an HTMLInputElement or HTMLTextAreaElement.`\n );\n }\n\n return element;\n }\n\n private isValidInputElement(\n element: Element\n ): element is HTMLInputElement | HTMLTextAreaElement {\n return (\n element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement\n );\n }\n\n private createFieldMetric(\n id: string,\n element: HTMLInputElement | HTMLTextAreaElement,\n ltm?: boolean\n ): TrackedFieldMetrics {\n return {\n field_name: id,\n started_at: 0,\n ended_at: 0,\n interaction_count: 0,\n fill_method: null,\n paste_count: 0,\n ltm: ltm ?? false,\n corrections_count: 0,\n pauses: 0,\n pauseDurations: [],\n element,\n };\n }\n\n private createInputHandler(field: TrackedFieldMetrics) {\n return (event: Event): void => {\n this.handleInput(field, event as InputEvent);\n };\n }\n\n private handleInput(\n currentField: TrackedFieldMetrics,\n event: InputEvent\n ): void {\n const now = performance.now();\n const lastInteractionTime = currentField.ended_at || 0;\n\n const interactions = this.analyzeInteraction(\n currentField,\n event,\n now,\n lastInteractionTime\n );\n\n this.updateFieldMetrics(currentField, interactions, now);\n }\n\n private analyzeInteraction(\n field: TrackedFieldMetrics,\n event: InputEvent,\n now: number,\n lastInteractionTime: number\n ) {\n const fillMethod = this.determineFillMethod(field, event);\n\n return {\n fillMethod,\n isCorrection: this.isCorrection(event),\n isPaste: this.isPaste(fillMethod, event),\n isPause: this.isPause(now, lastInteractionTime),\n pauseDuration: now - lastInteractionTime,\n };\n }\n\n private updateFieldMetrics(\n field: TrackedFieldMetrics,\n interactions: ReturnType<typeof this.analyzeInteraction>,\n now: number\n ): void {\n // Initialize start time on first interaction\n if (!field.started_at) {\n field.started_at = now;\n }\n\n field.ended_at = now;\n field.fill_method = interactions.fillMethod;\n field.interaction_count += 1;\n\n if (interactions.isCorrection) field.corrections_count += 1;\n if (interactions.isPaste) field.paste_count += 1;\n if (interactions.isPause) {\n field.pauses += 1;\n field.pauseDurations.push(interactions.pauseDuration);\n }\n }\n\n private determineFillMethod(\n field: TrackedFieldMetrics,\n event: InputEvent\n ): FillMethod {\n const inputType = event.inputType;\n if (!inputType) return FillEnum.paste;\n\n const currentMethod: FillMethod =\n inputType === \"insertText\"\n ? FillEnum.typed\n : inputType === \"insertFromPaste\"\n ? FillEnum.paste\n : FillEnum.mixed;\n\n // If methods have been mixed, maintain \"mixed\" state\n if (field.fill_method && field.fill_method !== currentMethod) {\n return FillEnum.mixed;\n }\n\n return currentMethod;\n }\n\n private isCorrection(event: InputEvent): boolean {\n return event.inputType === \"deleteContentBackward\";\n }\n\n private isPaste(fillMethod: FillMethod, event: InputEvent): boolean {\n return (\n fillMethod === FillEnum.paste || event.inputType === \"insertFromPaste\"\n );\n }\n\n private isPause(now: number, lastInteractionTime: number): boolean {\n if (lastInteractionTime === 0) return false;\n\n const timeSinceLastKeystroke = now - lastInteractionTime;\n return timeSinceLastKeystroke > this.config.pauseThresholdMs;\n }\n\n private removeFieldTracking(fieldId: string): void {\n const index = this.fields.findIndex(\n (field) => field.field_name === fieldId\n );\n\n if (index === -1) return;\n\n const field = this.fields[index];\n this.cleanupFieldTracking(field);\n\n this.fields.splice(index, 1);\n this.trackedFieldIds.delete(fieldId);\n }\n\n private removeAllTracking(): void {\n this.fields.forEach((field) => this.cleanupFieldTracking(field));\n this.fields.length = 0;\n this.trackedFieldIds.clear();\n }\n\n private cleanupFieldTracking(field: TrackedFieldMetrics): void {\n // Note: We can't remove the exact handler since we're using bound methods\n // In a real implementation, you'd want to store the bound handlers\n field.element.removeEventListener(\"input\", this.createInputHandler(field));\n }\n\n private ensureInitialized(): void {\n if (!this.isInitialized) {\n throw new GingerClientError(\n \"Ginger.trackEvent must be initialized before data can be fetched.\"\n );\n }\n }\n}\n\n// Singleton instance for the module\nconst eventTracker = new EventTracker();\n\n// Public API exports\nexport const trackInputs = (fields: readonly Field[]): void => {\n eventTracker.initializeTracking(fields);\n};\n\nexport const getTrackedFields = (): {\n distractions_count: number;\n fields: FieldMetrics[];\n} => {\n return {\n distractions_count: getCount(),\n fields: eventTracker.metrics,\n };\n};\n\nexport const removeTracking = (fieldId?: string): void => {\n eventTracker.removeTracking(fieldId);\n};\n\nexport { EventTracker, removeListener };\n","import {\n trackInputs,\n getTrackedFields,\n removeListener,\n} from \"../behaviour\";\n\nimport { buildInitialPayload } from \"../device\";\n\nimport {\n generateRequestId,\n GingerClientError,\n HttpClient,\n GingerHttpClient,\n BehaviourPayloadResponse,\n Configurations,\n EVENT_TYPES,\n EventParams,\n Payload,\n PayloadResponse,\n BehaviourPayload,\n BehaviourParams,\n PayloadResponseData,\n BehaviourPayloadResponseData,\n} from \"../core\";\n\ninterface GingerClient {\n initialize(configs: Configurations): Promise<PayloadResponse | undefined>;\n trackEvent(params: BehaviourParams): void;\n getTrackedData(): BehaviourPayload;\n submitEvent(): Promise<BehaviourPayloadResponseData>;\n}\n\nexport class GingerJsClient implements GingerClient {\n private readonly requestId = generateRequestId();\n private deviceResponse: PayloadResponseData | undefined;\n private isInitialized: boolean = false;\n private trackDetails: EventParams | undefined;\n private httpClient: HttpClient;\n\n constructor({ apikey }: Configurations) {\n this.httpClient = new GingerHttpClient(apikey);\n }\n\n async initialize() {\n try {\n const sdkInfo = { name: '@ginger-ai/ginger-js', version: '1.0.0' };\n const payload = await buildInitialPayload(this.requestId, sdkInfo);\n const response = await this.httpClient.post<Payload, PayloadResponse>({\n url: `/api/v1/devices`,\n payload,\n });\n\n this.isInitialized = true;\n this.deviceResponse = response.data;\n\n return response;\n } catch (error) {\n this.isInitialized = false;\n throw new GingerClientError(`Initialization failed: ${error}`);\n }\n }\n\n trackEvent({ event_type, track_fields, request_id }: BehaviourParams): void {\n if (!this.isInitialized) {\n throw new GingerClientError(\n \"Unsuccessful Initialization. Cannot track behaviour.\"\n );\n }\n\n if (!EVENT_TYPES.includes(event_type)) {\n throw new GingerClientError(\n `Invalid event type: ${event_type}. Allowed types are: ${EVENT_TYPES.join(\n \", \"\n )}`\n );\n }\n\n trackInputs(track_fields);\n this.trackDetails = {\n event_type,\n request_id,\n fingerprint_id: this.deviceResponse?.fingerprint_id || \"\",\n };\n }\n\n /**\n * Get tracked data\n */\n getTrackedData = () => {\n if (!this.isInitialized) {\n throw new GingerClientError(\n \"Unsuccessful Initialization. Cannot get tracked data.\"\n );\n }\n\n if (!this.trackDetails) {\n throw new GingerClientError(\n \"Tracking not initiated. Call `trackEvent` before getting tracked data.\"\n );\n }\n\n const trackData = getTrackedFields();\n\n return {\n event_type: this.trackDetails.event_type,\n request_id: this.trackDetails.request_id,\n fingerprint_id: this.trackDetails.fingerprint_id,\n data: { ...trackData },\n };\n };\n\n /**\n * Call submitEvent to submit tracked data\n */\n submitEvent = async () => {\n const payload = this.getTrackedData();\n console.log(payload)\n try {\n const response = await this.httpClient.post<\n BehaviourPayload,\n BehaviourPayloadResponse\n >({ url: `/api/v1/events`, payload });\n\n removeListener();\n return response.data;\n } catch (error) {\n throw new GingerClientError(\n `Tracked Data submission failed: ${String(error)}`\n );\n }\n };\n}\n"],"names":["generateRequestId","timestamp","Date","now","base34Alphabet","slice","tripleRecursivebase34Alphabet","toBase34","n","result","Math","floor","length","count","MAX_BASE_34","decoded","str","char","value","indexOf","toUpperCase","Error","fromBase34","max","maxBase34","random","getRandomSalt","GingerError","constructor","message","statusCode","response","super","this","name","GingerClientError","ALLOWED_DEVICE_TYPES","FillEnum","EVENT_TYPES","CONSTANTS","pageVisibility","leaveCount","visibilityHandler","document","visibilityState","getCount","addListener","addEventListener","removeListener","removeEventListener","makeRequest","async","url","payload","method","apikey","fetch","headers","Accept","Authorization","body","JSON","stringify","ok","jsonify","json","error","status","handleException","Method","GingerHttpClient","key","validatePresence","basePath","includes","getBasePath","post","options","POST","fullPath","e","exclude","include","logging","components","includeComponent","creationFunction","window","timeoutInstance","timeout","fmix","input","imul","C","Uint32Array","rotl","m","hash","seed","text","TextEncoder","encode","buffer","ArrayBuffer","TypeError","blocks","byteLength","view32","i","k","subarray","reminder","tail","Uint8Array","finalize","byteArray","Array","from","map","byte","toString","padStart","join","getFingerprintData","promiseMap","Object","fromEntries","entries","filter","some","startsWith","keys","promises","values","resolvedValues","timeoutTime","timeoutVal","Promise","all","p","race","t","val","resolve","setTimeout","raceAll","resolvedComponents","forEach","index","undefined","filterFingerprintData","obj","excludeList","includeList","path","currentPath","isArray","isExcluded","exclusion","isIncluded","inclusion","filtered","getFingerprint","fingerprintData","serializedFingerprint","serializedObject","thisHash","componentsUsedForHash","data","fpdata","getHashRelevantKeys","audio","fonts","hardware","math","permissions","screen","system","emojiFingerprint","vendorFlavour","colorGamut","canvas","webglBasics","webGlBasics","detectTorBrowser","score","Intl","DateTimeFormat","resolvedOptions","timeZone","webGLInfo","getWebGLInfo","vendor","RTCPeerConnection","navigator","deviceMemory","hardwareConcurrency","credentials","geolocation","confidence","toFixed","createElement","gl","getContext","renderer","debugInfo","getExtension","getParameter","UNMASKED_VENDOR_WEBGL","UNMASKED_RENDERER_WEBGL","detectIncognito","reject","browser_name","__callback","feid","toFixedEngineID","neg","parseInt","isMSIE","msSaveBlob","eval","newSafariTest","tmp_name","String","indexedDB","open","onupgradeneeded","res","target","createObjectStore","autoIncrement","put","Blob","close","deleteDatabase","storage","estimate","then","quota","catch","safariPrivateTest","maxTouchPoints","openDB","openDatabase","localStorage","setItem","removeItem","oldSafariTest","storageQuotaChromePrivateTest","webkitTemporaryStorage","queryUsageAndQuota","_","round","w","performance","memory","jsHeapSizeLimit","getQuotaLimit","chromePrivateTest","self","allSettled","fs","webkitRequestFileSystem","ua","userAgent","match","brave","identifyChromium","serviceWorker","extendStatics","d","b","setPrototypeOf","__proto__","prototype","hasOwnProperty","call","__awaiter","thisArg","_arguments","P","generator","fulfilled","step","next","rejected","done","apply","__generator","f","y","label","sent","trys","ops","g","create","Iterator","verb","Symbol","iterator","v","op","pop","push","__spreadArray","to","pack","arguments","ar","l","concat","SuppressedError","BotKind","BotdError","_super","state","_this","__","__extends","collect","sources","sourcesKeys","_a","sourceKey","_b","error_1","_c","_d","arrayIncludes","arr","strIncludes","getObjectProps","getOwnPropertyNames","_i","_loop_1","array","callback","find","arrayFind","test","keys_1","state_1","countTruthy","reduce","sum","detectors","detectAppVersion","appVersion","detectDocumentAttributes","documentElementKeys","detectErrorTrace","errorTrace","detectEvalLengthInconsistency","evalLength","browserKind","browserEngineKind","detectFunctionBind","functionBind","detectLanguagesLengthInconsistency","languages","detectNotificationPermissions","notificationPermissions","detectPluginsArray","pluginsArray","detectPluginsLengthInconsistency","pluginsLength","android","detectProcess","process","type","versions","electron","detectUserAgent","detectWebDriver","webDriver","detectWebGL","webGL","detectWindowExternal","windowExternal","detectWindowSize","windowSize","documentFocus","outerWidth","outerHeight","detectMimeTypesConsistent","mimeTypesConsistent","detectProductSub","productSub","detectDistinctiveProperties","distinctiveProps","bot","getBrowserEngineKind","documentElement","style","isItChromium","isItGecko","toLowerCase","hasFocus","rtt","connection","innerWidth","innerHeight","plugins","PluginArray","stack","external","mimeTypes","isConsistent","getPrototypeOf","MimeTypeArray","MimeType","canvasElement","webGLContext","VENDOR","RENDERER","webdriver","language","userLanguage","browserLanguage","systemLanguage","Reflect","split","permissionStatus","Notification","query","permission","getAttributeNames","Function","bind","errorPrefix","botName","distinctivePropsList","windowProps","documentProps","props","windowContains","documentContains","BotDetector","detections","getComponents","getDetections","detect","finalDetection","detectorName","detectorRes","detector","detection","botKind","load","monitoring","__fpjs_d_m","request","XMLHttpRequest","send","console","monitor","botDetection","getBrowserName","detectBrowser","version","engine","signatures","toFixedErrorLength","functionToStringLength","detectByEngineSignatures","getEngineSignatures","isBrave","chrome","app","runtime","csi","loadTimes","opr","opera","InstallTrigger","sidebar","HTMLElement","safari","pushNotification","msCredentials","documentMode","detectByFeatures","registerProtocolHandler","detectByProtocolHandlers","docStyle","getComputedStyle","getPropertyValue","detectByCssProperties","chromeLoad","firstPaintTime","requestTime","detectByPerformance","err","toDataURL","img","Image","loadCount","onload","onerror","src","__JQUERY_OBJECT__","detectByJsBehavior","CSS","supports","msLaunchUri","MSInputMethodContext","webstore","ctx","width","height","font","textBaseline","fillText","imageData","getImageData","detectEdgeBrowser","plugin","chromeMatch","chromeVersion","detectChromeBrowser","google","detectBraveBrowser","grouped","acc","curr","maxConfidence","detectedBrowser","browser","hasChromePdfViewer","hasEdgePluginPattern","isActuallyEdge","min","browserName","edgeMatch","braveMatch","getBrowserVersion","USER_AGENT","EMPTY","FUNC_TYPE","UNDEF_TYPE","OBJ_TYPE","STR_TYPE","UA_BROWSER","UA_CPU","UA_DEVICE","UA_ENGINE","UA_OS","UA_RESULT","NAME","TYPE","VERSION","ARCHITECTURE","MAJOR","MODEL","CONSOLE","MOBILE","TABLET","SMARTTV","WEARABLE","XR","EMBEDDED","INAPP","BRANDS","FORMFACTORS","FULLVERLIST","PLATFORM","PLATFORMVER","BITNESS","CH_HEADER","CH_HEADER_FULL_VER_LIST","CH_HEADER_ARCH","CH_HEADER_BITNESS","CH_HEADER_FORM_FACTORS","CH_HEADER_MOBILE","CH_HEADER_MODEL","CH_HEADER_PLATFORM","CH_HEADER_PLATFORM_VER","CH_ALL_VALUES","AMAZON","APPLE","ASUS","BLACKBERRY","GOOGLE","HUAWEI","LENOVO","HONOR","LG","MICROSOFT","MOTOROLA","NVIDIA","ONEPLUS","OPPO","SAMSUNG","SHARP","SONY","XIAOMI","ZEBRA","CHROME","CHROMIUM","CHROMECAST","EDGE","FIREFOX","OPERA","FACEBOOK","SOGOU","PREFIX_MOBILE","SUFFIX_BROWSER","WINDOWS","NAVIGATOR","NAVIGATOR_UADATA","userAgentData","enumerize","enums","has","str1","str2","lowerize","isString","isExtensions","deep","prop","itemListToArray","header","tokens","strip","token","trim","brand","majorize","setProps","propName","pattern","replace","stripQuotes","len","substring","rgxMapper","arrays","j","q","matches","regex","exec","strMapper","windowsVersionMap","ME","XP","Vista","NT","formFactorsMap","embedded","mobile","tablet","smarttv","wearable","xr","browserHintsMap","Chrome","Edge","Yandex","defaultRegexes","cpu","device","OnePlus","os","defaultProps","init","isIgnore","isIgnoreRgx","createIData","item","itemType","init_props","is_ignoreProps","is_ignoreRgx","toString_props","IData","getItem","withClientHints","getHighEntropyValues","setCH","UACHData","parseCH","get","withFeatureCheck","detectFeature","is","strToCheck","cb","that","IDataResolve","resolveData","uach","isHttpUACH","UAItem","rgxMap","uaCH","set","ch","standalone","parseUA","prevName","brands","brandName","brandVersion","archName","reParse","ff","idx","osName","osVersion","parse","UAParser","extensions","append","kv","getResult","httpUACH","regexMap","defaultRgx","mergedRgx","extraRgx","extend","createItemFunc","getBrowser","getCPU","getDevice","getEngine","getOS","setUA","BROWSER","CPU","DEVICE","ENGINE","OS","getOs","device_type","getDeviceType","normalizeOs","platform","lowerPlatform","patterns","ios","macos","windows","linux","determineDeviceType","claimedMobile","hasTouch","screenWidth","realOs","convertToTwoDP","num","parseFloat","analyzeSpoofing","claimed","signals","conflicts","analysis","spoofingConfidence","isSpoofed","detectionConflicts","realPlatform","realDeviceType","touchPoints","claimedOs","gpuOs","platformOs","actualPlatform","actualOs","suspectedOs","gpuVendor","gpuRenderer","gpuConflict","gpuSuggestedOs","preliminaryRealDeviceType","normalizedClaimedType","guessedDeviceType","determinedType","getDeviceDetails","initialResults","pixelRatio","userAgentString","devicePixelRatio","getSignalData","uaData","lowerUa","guessedType","guessDeviceTypeFromUA","brandMatch","versionMatch","RegExp","getClaimedData","deviceOs","deviceType","tampering","getBrowserDetails","user_agent","getCommonPixels","images","finalData","indice","u","getMostFrequent","pixelArray","Uint8ClampedArray","ImageData","frequencyMap","mostFrequent","sampleRate","numSamples","audioContext","OfflineAudioContext","webkitOfflineAudioContext","audioBuffer","createBufferSource","analyser","createAnalyser","frequencyData","Float32Array","frequencyBinCount","getFloatFrequencyData","oscillator","createOscillator","frequency","compressor","createDynamicsCompressor","threshold","knee","ratio","attack","release","connect","destination","start","oncomplete","maxChannels","maxChannelCount","channelCountMode","startRendering","_RUNS","wait","durationMs","resolveWith","imageDatas","gradient","createLinearGradient","addColorStop","fillStyle","fillRect","randomText","beginPath","moveTo","lineTo","strokeStyle","lineWidth","stroke","generateCanvasImageData","commonImageDataHash","availableFonts","baseFonts","measureSingleFont","measureText","getVideoCard","shadingLanguageVersion","SHADING_LANGUAGE_VERSION","vendorUnmasked","rendererUnmasked","getArchitecture","u8","Infinity","mostFrequentValuesInArrayOfDictionaries","mostFrequentValueForKey","element","highestFrequency","mostFrequentValue","permission_keys","isWebKit","isSafariWebKit","func","print","isGecko","isAndroid","isChromium","Audio","iframe","setAttribute","setProperty","appendChild","iframeDocument","contentDocument","contentWindow","removeChild","ephemeralIFrame","defaultWidths","results","fontWidth","memoryInfo","videocard","architecture","timezone","permissions_to_check","permissionPromises","retries","feature","getBrowserPermissionsOnce","resolvedPermissions","colorDepth","HTMLButtonElement","isWebKit616OrNewer","s","parseDimension","replacement","isNaN","replaceNaN","toInt","dimensions","sort","reverse","getUnstableScreenResolution","regexes","browserNameMap","edg","samsung","groups","createWebGLFingerprint","vertexShaderSource","fragmentShaderSource","vertexShader","createShader","VERTEX_SHADER","fragmentShader","FRAGMENT_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","getShaderInfoLog","shaderProgram","createProgram","attachShader","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","useProgram","numSpokes","vertices","angleIncrement","PI","angle","cos","sin","vertexBuffer","createBuffer","bindBuffer","ARRAY_BUFFER","bufferData","STATIC_DRAW","positionAttribute","getAttribLocation","enableVertexAttribArray","vertexAttribPointer","FLOAT","viewport","clearColor","clear","COLOR_BUFFER_BIT","drawArrays","LINES","pixelData","readPixels","RGBA","UNSIGNED_BYTE","drawingBufferWidth","drawingBufferHeight","createWebGLImageData","commonImageHash","getApplePayVersion","location","protocol","ApplePaySession","versionCheck","supportsVersion","cache","webgl","context","getWebGLContext","isValidParameterGetter","debugExtension","imageHash","filename","description","browserDetails","cookieEnabled","product","applePayVersion","TEST_EMOJIS","TEST_FONTS","renderEmojiToCanvas","emoji","fontFamily","size","textAlign","simplifyPixelData","pixels","simplified","combinedData","emojiFingerprintHash","emojiDetails","uniqueEmojisRendered","integrate","a","h","selectorToElement","selector","tag","attributes","errorMessage","tagMatch","partsRegex","addAttribute","part","attributeMatch","parseSimpleCssSelector","addStyleString","source","property","priority","doesMatch","matchMedia","acos","asin","atan","cosh","E","largeCos","largeSin","largeTan","tan","log","pi","sinh","sqrt","tanh","forceShow","filters","fromB64","atob","abpIndo","abpvn","adBlockFinland","adBlockPersian","adBlockWarningRemoval","adGuardAnnoyances","adGuardBase","adGuardChinese","adGuardFrench","adGuardGerman","adGuardJapanese","adGuardMobile","adGuardRussian","adGuardSocial","adGuardSpanishPortuguese","adGuardTrackingProtection","adGuardTurkish","bulgarian","easyList","easyListChina","easyListCookie","easyListCzechSlovak","easyListDutch","easyListGermany","easyListItaly","easyListLithuania","estonian","fanboyAnnoyances","fanboyAntiFacebook","fanboyEnhancedTrackers","fanboySocial","frellwitSwedish","greekAdBlock","hungarian","iDontCareAboutCookies","icelandicAbp","latvian","listKr","listeAr","listeFr","officialPolish","ro","ruAd","thaiAds","webAnnoyancesUltralist","getFilters","filterNames","allSelectors","filterName","blockedSelectors","selectors","root","elements","tagName","show","holder","offsetParent","parentNode","getBlockedSelectors","activeBlockers","flavors","sortedVendorFlavors","browsername","gamut","oscpu","AudioContext","baseLatency","buildInitialPayload","request_id","sdkInfo","fingerprint","torResult","botResult","incognito","osResult","deviceDetails","fetchModules","fingerprint_id","os_version","raw_device_data","tor","sdk","EventTracker","config","isInitialized","fields","trackedFieldIds","Set","DEFAULT_CONFIG","initializeTracking","field","id","trackField","metrics","ensureInitialized","removeTracking","fieldId","removeFieldTracking","removeAllTracking","ltm","getValidElement","fieldMetric","createFieldMetric","add","boundHandler","createInputHandler","getElementById","isValidInputElement","HTMLInputElement","HTMLTextAreaElement","field_name","started_at","ended_at","interaction_count","fill_method","paste_count","corrections_count","pauses","pauseDurations","event","handleInput","currentField","lastInteractionTime","interactions","analyzeInteraction","updateFieldMetrics","fillMethod","determineFillMethod","isCorrection","isPaste","isPause","pauseDuration","inputType","paste","currentMethod","typed","mixed","pauseThresholdMs","findIndex","cleanupFieldTracking","splice","delete","eventTracker","GingerJsClient","requestId","getTrackedData","trackDetails","trackData","distractions_count","event_type","submitEvent","httpClient","initialize","deviceResponse","trackEvent","track_fields"],"mappings":"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G7BvV,EAAIqV,UAAY,uBAChBrV,EAAIK,SAASkV,GAAY,IAAM,MAG/BvV,EAAIwV,YACJxV,EAAIyV,OAAO,EAAG,GACdzV,EAAI0V,OAAsB,EAAfjqB,EAAOwU,MAAU,EAAGxU,EAAOyU,QACtCF,EAAI2V,YAAc,QAClB3V,EAAI4V,UAAY,EAChB5V,EAAI6V,SAEJ,MAAMvV,EAAYN,EAAIO,aAAa,EAAG,EAAG9U,EAAOwU,MAAOxU,EAAOyU,QAE9D,OAAOI,CACX,CA1D0EwV,IAGlE3sB,EACI,CACI4sB,oBAAuB1vB,EAJP8rB,GAAgB8C,EAbjC,IACC,IAgB4CrqB,KAAKhD,YAAYA,cAI7E,GE5BA,MAAMouB,GAAiB,CACnB,QACA,cACA,eACA,mBACA,QACA,UACA,SACA,aACA,SACA,UACA,UACA,QACA,UACA,UACA,iBACA,gBACA,aACA,UACA,cACA,eACA,UACA,UACA,mBACA,gBACA,QACA,aACA,MACA,YACA,YACA,yBACA,WACA,SACA,UACA,YACA,YACA,SACA,cACA,eACA,QACA,eACA,QACA,OACA,SACA,gBACA,iBACA,sBACA,UACA,eACA,oBACA,aACA,SACA,YACA,SACA,cACA,YACA,SACA,WACA,SACA,WACA,WACA,WACA,UACA,WACA,UACA,SACA,cACA,YACA,WACA,YACA,SACA,mBACA,WACA,QACA,cACA,eACA,WACA,OACA,kBACA,aACA,SACA,UACA,QACA,kBACA,gBACA,eACA,SACA,eACA,UACA,aAGIC,GAAY,CAAC,YAAa,aAAc,SAkChD,SAASC,GAAkBlW,EAAsCG,GAC7D,IAAKH,EACD,MAAM,IAAIve,MAAM,gCAIpB,OADAue,EAAIG,KAAO,QAAQA,IACZH,EAAImW,YAFU,cAEQlW,KACjC,CC5HA,SAASmW,KACL,MAAM3qB,EAAS1I,SAAS8J,cAAc,UAChCC,EAAKrB,EAAOsB,WAAW,UAAYtB,EAAOsB,WAAW,sBAE3D,GAAID,GAAM,iBAAkBA,EACxB,IAEI,MAAMV,GAAUU,EAAGK,aAAaL,EAAGoN,SAAW,IAAItS,WAGlD,IAAI/G,EAA6B,CAC/BuL,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","x_google_ignoreList":[16,17,20]}
1
+ {"version":3,"file":"ginger.esm.js","sources":["../src/core/util/generate-requestid.ts","../src/core/util/error.ts","../src/core/dto/device-detector.dto.ts","../src/core/dto/metrics.dto.ts","../src/core/dto/ginger.dto.ts","../src/core/constants.ts","../src/core/helpers.ts","../src/core/http/request.ts","../src/core/http/httpClient.ts","../src/device/modules/options.ts","../src/device/factory.ts","../src/device/utils/hash.ts","../src/device/modules/fp.ts","../src/device/utils/raceAll.ts","../src/device/modules/tor.ts","../src/device/modules/incognito.ts","../node_modules/tslib/tslib.es6.js","../node_modules/@fingerprintjs/botd/dist/botd.esm.js","../src/device/modules/bot.ts","../src/device/components/system/browser.ts","../node_modules/ua-parser-js/src/main/ua-parser.mjs","../src/device/modules/os.ts","../src/device/modules/device/helpers.ts","../src/device/modules/device/analyze-data.ts","../src/device/modules/device/index.ts","../src/device/modules/device/gather-data.ts","../src/device/modules/browserDetails.ts","../src/device/utils/commonPixels.ts","../src/device/components/audio/audio.ts","../src/device/components/canvas/canvas.ts","../src/device/utils/ephemeralIFrame.ts","../src/device/components/fonts/fonts.ts","../src/device/components/hardware/hardware.ts","../src/device/utils/getMostFrequent.ts","../src/device/components/permissions/permissions.ts","../src/device/utils/data.ts","../src/device/utils/browser_.ts","../src/device/utils/misc.ts","../src/device/components/locales/locales.ts","../src/device/components/screen/screen.ts","../src/device/components/screen/screenResolution.ts","../src/device/components/webgl/imageHash.ts","../src/device/components/system/system.ts","../src/device/components/webgl/webgl.ts","../src/device/components/plugins/plugins.ts","../src/device/components/system/emoji.ts","../src/device/components/math/math.ts","../src/device/utils/async.ts","../src/device/utils/dom.ts","../src/device/components/extra/extra.ts","../src/device/index.ts","../src/behaviour/index.ts","../src/client/index.ts"],"sourcesContent":["export const generateRequestId = (): string => {\n const timestamp = Date.now();\n const base34Alphabet = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\".slice(0, 34);\n\n const base34 = tripleRecursivebase34Alphabet(timestamp, base34Alphabet);\n const requestId = `${timestamp}.${base34}`;\n\n return requestId;\n};\n\n// Convert number to base-34 (8-character output)\nfunction toBase34(n: number, base34Alphabet: string): string {\n if (n === 0) return \"00000000\";\n\n let result = \"\";\n while (n > 0) {\n let remainder = n % 34;\n result = base34Alphabet[remainder] + result;\n n = Math.floor(n / 34);\n }\n // Pad to 8 characters\n while (result.length < 8) {\n result = \"0\" + result;\n }\n return result.slice(-8);\n}\n\n// Convert base-34 string to number\nfunction fromBase34(str: string, base34Alphabet: string): number {\n let n = 0;\n for (let char of str) {\n let value = base34Alphabet.indexOf(char.toUpperCase());\n if (value === -1) throw new Error(\"Invalid base-34 character\");\n n = n * 34 + value;\n }\n return n;\n}\n\nfunction getRandomSalt(max: number): number {\n const maxBase34 = max; // 34^8\n return Math.floor(Math.random() * maxBase34);\n}\n\n// Recursive function to encode timestamp three times with hashing\nconst tripleRecursivebase34Alphabet = (\n timestamp: number,\n base34Alphabet: string,\n count: number = 1\n): string => {\n if (count > 3) {\n return toBase34(timestamp, base34Alphabet);\n }\n const MAX_BASE_34 = 1336336003215616;\n\n const saltedTimestamp =\n (timestamp + getRandomSalt(MAX_BASE_34)) % MAX_BASE_34;\n const encoded = toBase34(saltedTimestamp, base34Alphabet);\n\n const decoded = fromBase34(encoded, base34Alphabet);\n\n // Recursive call with incremented count\n return tripleRecursivebase34Alphabet(decoded, base34Alphabet, count + 1);\n};\n","// Move to another file\ninterface GingerErrorResponse {\n /**\n * HTTP status code\n */\n status: number;\n /**\n * HTTP status text\n */\n statusText: string;\n /**\n * HTTP headers object\n */\n headers: Headers;\n}\n\nexport class GingerError extends Error {\n statusCode: number;\n response: GingerErrorResponse;\n\n constructor(message: string, statusCode: number, response: GingerErrorResponse) {\n super(message);\n this.name = \"GingerError\";\n this.statusCode = statusCode;\n this.response = response;\n }\n}\n\nexport class GingerClientError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"GingerClientError\";\n }\n}\n\nexport const handleException = async (response: Response) => {\n const jsonify = await response.json();\n const message = jsonify?.error || jsonify.message || \"An error occurred\";\n throw new GingerError(message, response.status, response);\n};\n","export const ALLOWED_OS = [\n \"ios\",\n \"android\",\n \"windows\",\n \"macos\",\n \"linux\",\n] as const;\nexport const ALLOWED_DEVICE_TYPES = [\"mobile\", \"desktop\", \"tablet\"] as const;\n\nexport type AllowedOs = (typeof ALLOWED_OS)[number];\nexport type DeviceType = (typeof ALLOWED_DEVICE_TYPES)[number] | null;\n\nexport interface BrandInfo {\n brand: string;\n version: string;\n}\n\nexport interface ClaimedDevice {\n platform: string;\n mobile: boolean;\n brands: BrandInfo[];\n guessedDeviceType: DeviceType | null;\n}\n\nexport interface ScreenInfo {\n width: number;\n height: number;\n pixelRatio: number;\n}\n\nexport interface WebGLInfo {\n vendor?: string;\n renderer?: string;\n error: string;\n}\nexport interface DeviceSignals {\n actualPlatform: string;\n touchPoints: number;\n screen: ScreenInfo;\n webGL: WebGLInfo;\n readonly userAgentString: string;\n}\n\nexport interface DeviceAnalysis {\n confidence: number;\n spoofingConfidence: number;\n isSpoofed: boolean;\n detectionConflicts: string[];\n realPlatform: AllowedOs | null;\n realDeviceType: DeviceType;\n}\nexport interface DeviceResults {\n claimed: ClaimedDevice;\n signals: DeviceSignals;\n analysis: DeviceAnalysis;\n}\n\nexport interface RefinedDeviceResults extends DeviceResults {\n deviceOs: AllowedOs | null;\n deviceType: DeviceType;\n tampering: deviceTampering;\n}\n\nexport interface deviceTampering {\n status: boolean;\n confidence?: number;\n}\n","export type FillMethod = \"typed\" | \"pasted\" | \"mixed\" | null;\n\nexport enum FillEnum {\n typed = \"typed\",\n paste = \"pasted\",\n mixed = \"mixed\",\n}\n\nexport interface FieldMetrics {\n field_name: string;\n ltm: boolean;\n started_at: number;\n ended_at: number;\n interaction_count: number;\n fill_method: FillMethod;\n paste_count: number;\n corrections_count: number;\n pauses: number;\n pauseDurations: number[];\n}\n","import { BotDetectionResult } from \"./bot-detector.dto\";\nimport { IncognitoDetectionResult } from \"./incognito-detector.dto\";\nimport { TorDetectionResult } from \"./tor-detector.dto\";\nimport { RawDeviceData } from \"./fingerprint.dto\";\nimport { deviceTampering } from \"./device-detector.dto\";\nimport { FieldMetrics } from \"./metrics.dto\";\n\ninterface Device {\n fingerprint_id: string;\n type: string;\n os: string | null;\n os_version: string | undefined;\n browserDetails: BrowserDetails;\n bot: BotDetectionResult;\n incognito: IncognitoDetectionResult;\n tor: TorDetectionResult;\n tampering: deviceTampering;\n raw_device_data: RawDeviceData;\n}\n\nexport interface BrowserDetails {\n name: string;\n version: string;\n user_agent: string;\n}\n\nexport interface Payload {\n request_id: string;\n device: Device;\n}\n\nexport const EVENT_TYPES = [\n \"login\",\n \"registration\",\n \"credentials_update\",\n \"alerts_snooze\",\n] as const;\n\nexport type ALLOWED_EVENT_TYPES = (typeof EVENT_TYPES)[number];\n\nexport interface EventParams {\n event_type: ALLOWED_EVENT_TYPES;\n request_id: string | undefined;\n fingerprint_id: string;\n}\n\nexport interface BehaviourParams extends Omit<EventParams, \"fingerprint_id\"> {\n track_fields: Field[];\n}\n\nexport interface Field {\n id: string;\n ltm?: boolean;\n}\n\nexport interface Configurations {\n apikey: string;\n}\n\nexport interface BehaviourPayload extends EventParams {\n data: {\n fields: FieldMetrics[];\n distractions_count: number;\n };\n}\n\nexport interface BehaviourPayloadResponse {\n status: string;\n message: string;\n data: BehaviourPayloadResponseData;\n}\n\nexport interface BehaviourPayloadResponseData {\n request_id: string;\n fingerprint_id: string;\n event_type: string;\n message: string;\n occured_at: string;\n}\nexport interface PayloadResponse {\n status: string;\n message: string;\n data: PayloadResponseData;\n}\n\nexport type PayloadResponseData = {\n fingerprint_id: string;\n [key: string]: string | string[] | boolean | PayloadResponseData | PayloadResponseData[] \n}\n","export const CONSTANTS = {\n LIVE_URL: \"https://app.getrayyan.com\",\n TEST_URL: \"https://sandbox.useginger.ai\"\n}","import { CONSTANTS } from \"./constants\";\nimport { GingerClientError } from \"./util/error\";\n\nexport default function getBasePath(apikey: string) {\n if (apikey.includes(\"sk_live\") || apikey.includes(\"pk_live\"))\n return CONSTANTS.LIVE_URL;\n \n return CONSTANTS.TEST_URL;\n}\n\nexport const pageVisibility = () => {\n let leaveCount = 0;\n\n const countPageLeaves = () => {\n if (document.visibilityState === \"hidden\") {\n leaveCount++;\n }\n };\n\n const visibilityHandler = () => countPageLeaves();\n\n return {\n getCount: () => leaveCount,\n addListener: () =>\n document.addEventListener(\"visibilitychange\", visibilityHandler),\n removeListener: () =>\n document.removeEventListener(\"visibilitychange\", visibilityHandler),\n };\n};\n\nexport const validatePresence = (key: string) => {\n if (!key) throw new GingerClientError(\"'apikey' must be provided.\");\n};\n","import { handleException } from \"../util/error\";\n\ntype Method = \"POST\" | \"GET\" | \"PUT\" | \"DELETE\";\n\nexport const makeRequest = async <Request, Response>(\n url: string,\n payload: Request,\n method: Method,\n apikey: string\n): Promise<Response> => {\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n Authorization: `Bearer ${apikey}`,\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n await handleException(response);\n }\n\n const responseJSON = await response.json();\n return responseJSON;\n } catch (error) {\n throw error;\n }\n};\n","import getBasePath, { validatePresence } from \"../helpers\";\nimport { makeRequest } from \"./request\";\n\nenum Method {\n POST = \"POST\",\n}\n\ninterface HttpOptions<T> {\n /**\n * The URL to which the request is sent.\n */\n url: string;\n /**\n * payload to send\n */\n payload: T;\n /**\n * API Method\n */\n method?: Method;\n}\n\nexport interface HttpClient {\n post<T, U>(options: HttpOptions<T>): Promise<U>;\n}\n\nexport class GingerHttpClient implements HttpClient {\n readonly basePath: string;\n readonly apikey: string;\n\n constructor(apikey: string) {\n validatePresence(apikey);\n this.basePath = getBasePath(apikey);\n this.apikey = apikey;\n }\n\n async post<T, U>(options: HttpOptions<T>): Promise<U> {\n const { url, payload, method = Method.POST } = options;\n const fullPath = `${this.basePath}${url}`;\n try {\n const response = await makeRequest<T, U>(\n fullPath,\n payload,\n method,\n this.apikey\n );\n return response;\n } catch (e) {\n throw e;\n }\n }\n}\n","export interface optionsInterface {\n exclude: string[],\n include: string[],\n webgl_runs?: number,\n canvas_runs?: number,\n permissions_to_check?: PermissionName[], // new option\n retries?: number, // new option\n timeout?: number, // new option\n logging: boolean\n}\n\nexport let options: optionsInterface = {\n exclude: [],\n include: [],\n logging: true,\n}\n\n","import { options } from './modules/options';\n\n// the component interface is the form of the JSON object the function's promise must return\nexport interface componentInterface {\n [key: string]: string | string[] | number | boolean | componentInterface;\n}\n\n\n// The component function's interface is simply the promise of the above\nexport interface componentFunctionInterface {\n (): Promise<componentInterface>;\n}\n\n// components include a dictionary of name: function.\nexport const components: {[name: string]: componentFunctionInterface} = {};\n\n\n/** \n * includeComponent is the function each component function needs to call in order for the component to be included\n * in the fingerprint.\n * @param {string} name - the name identifier of the component\n * @param {componentFunctionInterface} creationFunction - the function that implements the component\n * @returns \n */ \nexport const includeComponent = (name:string, creationFunction: componentFunctionInterface) => {\n if (typeof window !== 'undefined')\n components[name] = creationFunction;\n}\n\n\n/**\n * The function turns the map of component functions to a map of Promises when called\n * @returns {[name: string]: <Promise>componentInterface} \n */\nexport const getComponentPromises = () => {\n return Object.fromEntries(\n Object.entries(components)\n .filter(([key]) => {\n return !options?.exclude?.includes(key)}\n )\n .filter(([key]) => {\n return options?.include?.some(e => e.includes('.'))\n ? options?.include?.some(e => e.startsWith(key))\n : options?.include?.length === 0 || options?.include?.includes(key)\n }\n )\n .map(([key, value]) => [key, value()])\n );\n}\n\n\nexport const timeoutInstance: componentInterface = {\n 'timeout': \"true\"\n}\n","/**\n * This code is taken from https://github.com/LinusU/murmur-128/blob/master/index.js\n * But instead of dependencies to encode-utf8 and fmix, I've implemented them here.\n */\n\nfunction encodeUtf8(text: string): any {\n const encoder = new TextEncoder();\n return encoder.encode(text).buffer;\n}\n \nfunction fmix (input : number) : number {\n input ^= (input >>> 16)\n input = Math.imul(input, 0x85ebca6b)\n input ^= (input >>> 13)\n input = Math.imul(input, 0xc2b2ae35)\n input ^= (input >>> 16)\n\n return (input >>> 0)\n}\n \nconst C = new Uint32Array([\n 0x239b961b,\n 0xab0e9789,\n 0x38b34ae5,\n 0xa1e38b93\n])\n \nfunction rotl (m : number, n : number) : number {\n return (m << n) | (m >>> (32 - n))\n}\n \nfunction body (key : ArrayBuffer, hash : Uint32Array) {\n const blocks = (key.byteLength / 16) | 0\n const view32 = new Uint32Array(key, 0, blocks * 4)\n\n for (let i = 0; i < blocks; i++) {\n const k = view32.subarray(i * 4, (i + 1) * 4)\n\n k[0] = Math.imul(k[0], C[0])\n k[0] = rotl(k[0], 15)\n k[0] = Math.imul(k[0], C[1])\n\n hash[0] = (hash[0] ^ k[0])\n hash[0] = rotl(hash[0], 19)\n hash[0] = (hash[0] + hash[1])\n hash[0] = Math.imul(hash[0], 5) + 0x561ccd1b\n\n k[1] = Math.imul(k[1], C[1])\n k[1] = rotl(k[1], 16)\n k[1] = Math.imul(k[1], C[2])\n\n hash[1] = (hash[1] ^ k[1])\n hash[1] = rotl(hash[1], 17)\n hash[1] = (hash[1] + hash[2])\n hash[1] = Math.imul(hash[1], 5) + 0x0bcaa747\n\n k[2] = Math.imul(k[2], C[2])\n k[2] = rotl(k[2], 17)\n k[2] = Math.imul(k[2], C[3])\n\n hash[2] = (hash[2] ^ k[2])\n hash[2] = rotl(hash[2], 15)\n hash[2] = (hash[2] + hash[3])\n hash[2] = Math.imul(hash[2], 5) + 0x96cd1c35\n\n k[3] = Math.imul(k[3], C[3])\n k[3] = rotl(k[3], 18)\n k[3] = Math.imul(k[3], C[0])\n\n hash[3] = (hash[3] ^ k[3])\n hash[3] = rotl(hash[3], 13)\n hash[3] = (hash[3] + hash[0])\n hash[3] = Math.imul(hash[3], 5) + 0x32ac3b17\n }\n}\n \nfunction tail (key : ArrayBuffer, hash : Uint32Array) {\n const blocks = (key.byteLength / 16) | 0\n const reminder = (key.byteLength % 16)\n \n const k = new Uint32Array(4)\n const tail = new Uint8Array(key, blocks * 16, reminder)\n \n switch (reminder) {\n case 15:\n k[3] = (k[3] ^ (tail[14] << 16))\n break// fallthrough\n case 14:\n k[3] = (k[3] ^ (tail[13] << 8))\n break// fallthrough\n case 13:\n k[3] = (k[3] ^ (tail[12] << 0))\n \n k[3] = Math.imul(k[3], C[3])\n k[3] = rotl(k[3], 18)\n k[3] = Math.imul(k[3], C[0])\n hash[3] = (hash[3] ^ k[3])\n break\n // fallthrough\n case 12:\n k[2] = (k[2] ^ (tail[11] << 24))\n break// fallthrough\n case 11:\n k[2] = (k[2] ^ (tail[10] << 16))\n break// fallthrough\n case 10:\n k[2] = (k[2] ^ (tail[9] << 8))\n break// fallthrough\n case 9:\n k[2] = (k[2] ^ (tail[8] << 0))\n \n k[2] = Math.imul(k[2], C[2])\n k[2] = rotl(k[2], 17)\n k[2] = Math.imul(k[2], C[3])\n hash[2] = (hash[2] ^ k[2])\n break\n // fallthrough\n case 8:\n k[1] = (k[1] ^ (tail[7] << 24))\n break// fallthrough\n case 7:\n k[1] = (k[1] ^ (tail[6] << 16))\n break// fallthrough\n case 6:\n k[1] = (k[1] ^ (tail[5] << 8))\n break// fallthrough\n case 5:\n k[1] = (k[1] ^ (tail[4] << 0))\n \n k[1] = Math.imul(k[1], C[1])\n k[1] = rotl(k[1], 16)\n k[1] = Math.imul(k[1], C[2])\n hash[1] = (hash[1] ^ k[1])\n break\n // fallthrough\n case 4:\n k[0] = (k[0] ^ (tail[3] << 24))\n break// fallthrough\n case 3:\n k[0] = (k[0] ^ (tail[2] << 16))\n break// fallthrough\n case 2:\n k[0] = (k[0] ^ (tail[1] << 8))\n break// fallthrough\n case 1:\n k[0] = (k[0] ^ (tail[0] << 0))\n \n k[0] = Math.imul(k[0], C[0])\n k[0] = rotl(k[0], 15)\n k[0] = Math.imul(k[0], C[1])\n hash[0] = (hash[0] ^ k[0])\n break\n }\n}\n \nfunction finalize (key : ArrayBuffer, hash : Uint32Array) {\n hash[0] = (hash[0] ^ key.byteLength)\n hash[1] = (hash[1] ^ key.byteLength)\n hash[2] = (hash[2] ^ key.byteLength)\n hash[3] = (hash[3] ^ key.byteLength)\n \n hash[0] = (hash[0] + hash[1]) | 0\n hash[0] = (hash[0] + hash[2]) | 0\n hash[0] = (hash[0] + hash[3]) | 0\n \n hash[1] = (hash[1] + hash[0]) | 0\n hash[2] = (hash[2] + hash[0]) | 0\n hash[3] = (hash[3] + hash[0]) | 0\n \n hash[0] = fmix(hash[0])\n hash[1] = fmix(hash[1])\n hash[2] = fmix(hash[2])\n hash[3] = fmix(hash[3])\n \n hash[0] = (hash[0] + hash[1]) | 0\n hash[0] = (hash[0] + hash[2]) | 0\n hash[0] = (hash[0] + hash[3]) | 0\n \n hash[1] = (hash[1] + hash[0]) | 0\n hash[2] = (hash[2] + hash[0]) | 0\n hash[3] = (hash[3] + hash[0]) | 0\n}\n \nexport function hash (key : ArrayBuffer | string, seed = 0) : string {\n seed = (seed ? (seed | 0) : 0)\n \n if (typeof key === 'string') {\n key = encodeUtf8(key)\n }\n \n if (!(key instanceof ArrayBuffer)) {\n throw new TypeError('Expected key to be ArrayBuffer or string')\n }\n \n const hash = new Uint32Array([seed, seed, seed, seed])\n \n body(key, hash)\n tail(key, hash)\n finalize(key, hash)\n const byteArray = new Uint8Array(hash.buffer);\n return Array.from(byteArray).map(byte => byte.toString(16).padStart(2, '0')).join('');\n}","import {\n FingerprintComponentValue,\n GingerJsFp,\n} from \"../../core\";\nimport {\n componentInterface,\n getComponentPromises,\n timeoutInstance,\n} from \"../factory\";\nimport { hash } from \"../utils/hash\";\nimport { raceAll } from \"../utils/raceAll\";\nimport { options } from \"./options\";\n\nexport async function getFingerprintData(): Promise<componentInterface> {\n try {\n const promiseMap: Record<\n string,\n Promise<componentInterface>\n > = getComponentPromises();\n\n const keys: string[] = Object.keys(promiseMap);\n const promises: Promise<componentInterface>[] = Object.values(promiseMap);\n const resolvedValues: (componentInterface | undefined)[] = await raceAll(\n promises,\n options?.timeout || 1000,\n timeoutInstance\n );\n\n const resolvedComponents: Record<string, componentInterface> = {};\n \n resolvedValues.forEach((value, index) => {\n if (value !== undefined) {\n resolvedComponents[keys[index]] = value;\n }\n });\n\n return filterFingerprintData(\n resolvedComponents,\n options.exclude || [],\n options.include || [],\n \"\"\n );\n } catch (error) {\n throw error;\n }\n}\n\n/**\n * This function filters the fingerprint data based on the exclude and include list\n * @param {componentInterface} obj - components objects from main componentInterface\n * @param {string[]} excludeList - elements to exclude from components objects (e.g : 'canvas', 'system.browser')\n * @param {string[]} includeList - elements to only include from components objects (e.g : 'canvas', 'system.browser')\n * @param {string} path - auto-increment path iterating on key objects from components objects\n * @returns {componentInterface} result - returns the final object before hashing in order to get fingerprint\n */\nexport function filterFingerprintData(\n obj: componentInterface,\n excludeList: string[],\n includeList: string[],\n path: string = \"\"\n): componentInterface {\n const result: componentInterface = {};\n for (const [key, value] of Object.entries(obj)) {\n const currentPath = path + key + \".\";\n\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const filtered = filterFingerprintData(\n value,\n excludeList,\n includeList,\n currentPath\n );\n if (Object.keys(filtered).length > 0) {\n result[key] = filtered;\n }\n } else {\n const isExcluded = excludeList.some((exclusion) =>\n currentPath.startsWith(exclusion)\n );\n const isIncluded = includeList.some((inclusion) =>\n currentPath.startsWith(inclusion)\n );\n\n if (!isExcluded || isIncluded) {\n result[key] = value;\n }\n }\n }\n\n return result;\n}\n\nexport async function getFingerprint(): Promise<GingerJsFp> {\n try {\n const fingerprintData = await getFingerprintData();\n\n const serializedFingerprint = getSerializedFingerprintObj(fingerprintData);\n const thisHash = hash(JSON.stringify(serializedFingerprint));\n const componentsUsedForHash = getHashRelevantKeys(serializedFingerprint as componentInterface);\n return {\n hash: thisHash.toString(),\n data: fingerprintData,\n componentsUsedForHash: componentsUsedForHash,\n };\n } catch (error) {\n throw error;\n }\n}\n\nfunction serializedObject(data: componentInterface): FingerprintComponentValue {\n return {\n audio: data.audio,\n fonts: data.fonts,\n hardware: data.hardware,\n math: data.math,\n permissions: data.permissions,\n screen: data.screen,\n system: data.system,\n emojiFingerprint: data.emojiFingerprint,\n vendorFlavour: data.vendorFlavour,\n colorGamut: data.colorGamut,\n canvas: data.canvas,\n webglBasics: data.webGlBasics,\n };\n}\n\nfunction getSerializedFingerprintObj(\n data: componentInterface\n): FingerprintComponentValue {\n return serializedObject(data);\n}\n\nfunction getHashRelevantKeys(\n data: componentInterface\n): Array<keyof FingerprintComponentValue> {\n const fpdata = serializedObject(data);\n return Object.keys(fpdata) as Array<keyof FingerprintComponentValue>;\n}\n","type DelayedPromise<T> = Promise<T>;\n\nexport function delay<T>(t: number, val: T): DelayedPromise<T> {\n return new Promise<T>((resolve) => {\n setTimeout(() => resolve(val), t);\n });\n}\n\n\nexport interface RaceResult<T> {\n value: T;\n elapsed?: number;\n}\n\nexport function raceAll<T>(promises: Promise<T>[], timeoutTime: number, timeoutVal: T): Promise<(T | undefined)[]> {\n return Promise.all(promises.map((p) => {\n return Promise.race([p, delay(timeoutTime, timeoutVal)]);\n }));\n}","import { TorDetectionResult } from \"../../core\";\n\nasync function detectTorBrowser(): Promise<TorDetectionResult> {\n const totalChecks = 7;\n let score = 0;\n\n const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;\n if (tz === \"Atlantic/Reykjavik\") score++;\n const webGLInfo = getWebGLInfo();\n if ([\"Mozilla\", \"unknown\"].includes(webGLInfo.vendor)) score++;\n if (!window.RTCPeerConnection) score++;\n if (!(navigator as any).deviceMemory) score++;\n if (navigator.hardwareConcurrency === 2) score++;\n if (!navigator.credentials) score++;\n if (!navigator.geolocation) score++;\n\n return {\n status: score >= 6,\n confidence: `${((score / totalChecks)).toFixed(2)}`,\n };\n}\n\nconst getWebGLInfo = (): { vendor: string; renderer: string } => {\n try {\n const canvas = document.createElement(\"canvas\");\n const gl: any =\n canvas.getContext(\"webgl\") || canvas.getContext(\"experimental-webgl\");\n if (!gl) return { vendor: \"unsupported\", renderer: \"unsupported\" };\n const debugInfo = gl.getExtension(\"WEBGL_debug_renderer_info\");\n return debugInfo\n ? {\n vendor: gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL),\n renderer: gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL),\n }\n : { vendor: \"unknown\", renderer: \"unknown\" };\n } catch {\n return { vendor: \"error\", renderer: \"error\" };\n }\n};\n\nexport { detectTorBrowser };\n","type IncognitoDetectionResult = {\n status: boolean;\n browser_name: string;\n};\n\nasync function detectIncognito(): Promise<IncognitoDetectionResult> {\n return new Promise(function (resolve, reject) {\n let browser_name = 'unknown';\n\n function __callback (status: boolean): void {\n resolve({\n status,\n browser_name\n })\n }\n \n function identifyChromium (): string {\n const ua = navigator.userAgent\n if (ua.match(/Chrome/)) {\n if ((navigator as any).brave !== undefined) {\n return 'Brave'\n } else if (ua.match(/Edg/)) {\n return 'Edge'\n } else if (ua.match(/OPR/)) {\n return 'Opera'\n }\n return 'Chrome'\n } else {\n return 'Chromium'\n }\n }\n \n function assertEvalToString (value: number): boolean {\n return value === eval.toString().length\n }\n \n function feid (): number {\n let toFixedEngineID = 0\n let neg = parseInt(\"-1\")\n try {\n neg.toFixed(neg)\n } catch (e) {\n toFixedEngineID = (e as Error).message.length \n }\n return toFixedEngineID\n }\n \n function isSafari (): boolean {\n return feid() === 44\n }\n \n function isChrome (): boolean {\n return feid() === 51\n }\n \n function isFirefox (): boolean {\n return feid() === 25\n }\n \n function isMSIE (): boolean {\n return (\n (navigator as any).msSaveBlob !== undefined && assertEvalToString(39)\n )\n }\n \n /**\n * Safari (Safari for iOS & macOS)\n **/\n \n function newSafariTestByStorageFallback (): void {\n if (!navigator.storage?.estimate) {\n __callback(false);\n return;\n }\n \n navigator.storage\n .estimate()\n .then(({ quota }) => {\n // iOS 18.x/macOS Safari 18.x (normal): ~41GB\n // iOS 18.x/macOS Safari 18.x (private): ~1GB\n // If reported quota < 2 GB => likely private\n if (quota && quota < 2_000_000_000) {\n __callback(true);\n } else {\n __callback(false);\n }\n })\n .catch(() => {\n __callback(false);\n });\n }\n \n function newSafariTest (): void {\n const tmp_name = String(Math.random())\n \n try {\n const db = window.indexedDB.open(tmp_name, 1)\n \n db.onupgradeneeded = function (i: any) {\n const res = i.target?.result\n \n try {\n res.createObjectStore('test', {\n autoIncrement: true\n }).put(new Blob())\n } catch (e) {\n let message = e\n \n if (e instanceof Error) {\n message = e.message ?? e\n }\n \n if (typeof message !== 'string') {\n __callback(false); return\n }\n \n const matchesExpectedError = message.includes('BlobURLs are not yet supported')\n if (matchesExpectedError) {\n __callback(true)\n }\n } finally {\n res.close()\n window.indexedDB.deleteDatabase(tmp_name)\n \n // indexdb works on newer versions of safari so we need to check via storage fallback\n newSafariTestByStorageFallback();\n }\n }\n } catch (e) {\n __callback(false)\n }\n }\n \n function oldSafariTest (): void {\n const openDB = (window as any).openDatabase\n const storage = window.localStorage\n try {\n openDB(null, null, null, null)\n } catch (e) {\n __callback(true); return\n }\n try {\n storage.setItem('test', '1')\n storage.removeItem('test')\n } catch (e) {\n __callback(true); return\n }\n __callback(false)\n }\n \n function safariPrivateTest (): void {\n if (navigator.maxTouchPoints !== undefined) {\n newSafariTest()\n } else {\n oldSafariTest()\n }\n }\n \n /**\n * Chrome\n **/\n \n function getQuotaLimit (): number {\n const w = window as any\n if (\n w.performance !== undefined &&\n w.performance.memory !== undefined &&\n w.performance.memory.jsHeapSizeLimit !== undefined\n ) {\n return (performance as any).memory.jsHeapSizeLimit\n }\n return 1073741824\n }\n \n // >= 76\n function storageQuotaChromePrivateTest (): void {\n (navigator as any).webkitTemporaryStorage.queryUsageAndQuota(\n function (_: number, quota: number) {\n const quotaInMib = Math.round(quota / (1024 * 1024))\n const quotaLimitInMib = Math.round(getQuotaLimit() / (1024 * 1024)) * 2\n \n __callback(quotaInMib < quotaLimitInMib)\n },\n function (e: any) {\n reject(\n new Error(\n 'detectIncognito somehow failed to query storage quota: ' +\n e.message\n )\n )\n }\n )\n }\n \n // 50 to 75\n function oldChromePrivateTest (): void {\n const fs = (window as any).webkitRequestFileSystem\n const success = function () {\n __callback(false)\n }\n const error = function () {\n __callback(true)\n }\n fs(0, 1, success, error)\n }\n \n function chromePrivateTest (): void {\n if (self.Promise !== undefined && (self.Promise as any).allSettled !== undefined) {\n storageQuotaChromePrivateTest()\n } else {\n oldChromePrivateTest()\n }\n }\n \n /**\n * Firefox\n **/\n \n function firefoxPrivateTest (): void {\n __callback(navigator.serviceWorker === undefined)\n }\n \n /**\n * MSIE\n **/\n \n function msiePrivateTest (): void {\n __callback(window.indexedDB === undefined)\n }\n \n function main (): void {\n if (isSafari()) {\n browser_name = 'Safari'\n safariPrivateTest()\n } else if (isChrome()) {\n browser_name = identifyChromium()\n chromePrivateTest()\n } else if (isFirefox()) {\n browser_name = 'Firefox'\n firefoxPrivateTest()\n } else if (isMSIE()) {\n browser_name = 'Internet Explorer'\n msiePrivateTest()\n } else {\n reject(new Error('detectIncognito cannot determine the browser'))\n }\n }\n \n main()\n })\n }\n\nexport {detectIncognito}","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","/**\n * Fingerprint BotD v1.9.1 - Copyright (c) FingerprintJS, Inc, 2024 (https://fingerprint.com)\n * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.\n */\n\nimport { __extends, __awaiter, __generator, __spreadArray } from 'tslib';\n\nvar version = \"1.9.1\";\n\n/**\n * Enum for types of bots.\n * Specific types of bots come first, followed by automation technologies.\n *\n * @readonly\n * @enum {string}\n */\nvar BotKind = {\n // Object is used instead of Typescript enum to avoid emitting IIFE which might be affected by further tree-shaking.\n // See example of compiled enums https://stackoverflow.com/q/47363996)\n Awesomium: 'awesomium',\n Cef: 'cef',\n CefSharp: 'cefsharp',\n CoachJS: 'coachjs',\n Electron: 'electron',\n FMiner: 'fminer',\n Geb: 'geb',\n NightmareJS: 'nightmarejs',\n Phantomas: 'phantomas',\n PhantomJS: 'phantomjs',\n Rhino: 'rhino',\n Selenium: 'selenium',\n Sequentum: 'sequentum',\n SlimerJS: 'slimerjs',\n WebDriverIO: 'webdriverio',\n WebDriver: 'webdriver',\n HeadlessChrome: 'headless_chrome',\n Unknown: 'unknown',\n};\n/**\n * Bot detection error.\n */\nvar BotdError = /** @class */ (function (_super) {\n __extends(BotdError, _super);\n /**\n * Creates a new BotdError.\n *\n * @class\n */\n function BotdError(state, message) {\n var _this = _super.call(this, message) || this;\n _this.state = state;\n _this.name = 'BotdError';\n Object.setPrototypeOf(_this, BotdError.prototype);\n return _this;\n }\n return BotdError;\n}(Error));\n\nfunction detect(components, detectors) {\n var detections = {};\n var finalDetection = {\n bot: false,\n };\n for (var detectorName in detectors) {\n var detector = detectors[detectorName];\n var detectorRes = detector(components);\n var detection = { bot: false };\n if (typeof detectorRes === 'string') {\n detection = { bot: true, botKind: detectorRes };\n }\n else if (detectorRes) {\n detection = { bot: true, botKind: BotKind.Unknown };\n }\n detections[detectorName] = detection;\n if (detection.bot) {\n finalDetection = detection;\n }\n }\n return [detections, finalDetection];\n}\nfunction collect(sources) {\n return __awaiter(this, void 0, void 0, function () {\n var components, sourcesKeys;\n var _this = this;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n components = {};\n sourcesKeys = Object.keys(sources);\n return [4 /*yield*/, Promise.all(sourcesKeys.map(function (sourceKey) { return __awaiter(_this, void 0, void 0, function () {\n var res, _a, _b, error_1;\n var _c;\n return __generator(this, function (_d) {\n switch (_d.label) {\n case 0:\n res = sources[sourceKey];\n _d.label = 1;\n case 1:\n _d.trys.push([1, 3, , 4]);\n _a = components;\n _b = sourceKey;\n _c = {};\n return [4 /*yield*/, res()];\n case 2:\n _a[_b] = (_c.value = _d.sent(),\n _c.state = 0 /* State.Success */,\n _c);\n return [3 /*break*/, 4];\n case 3:\n error_1 = _d.sent();\n if (error_1 instanceof BotdError) {\n components[sourceKey] = {\n state: error_1.state,\n error: \"\".concat(error_1.name, \": \").concat(error_1.message),\n };\n }\n else {\n components[sourceKey] = {\n state: -3 /* State.UnexpectedBehaviour */,\n error: error_1 instanceof Error ? \"\".concat(error_1.name, \": \").concat(error_1.message) : String(error_1),\n };\n }\n return [3 /*break*/, 4];\n case 4: return [2 /*return*/];\n }\n });\n }); }))];\n case 1:\n _a.sent();\n return [2 /*return*/, components];\n }\n });\n });\n}\n\nfunction detectAppVersion(_a) {\n var appVersion = _a.appVersion;\n if (appVersion.state !== 0 /* State.Success */)\n return false;\n if (/headless/i.test(appVersion.value))\n return BotKind.HeadlessChrome;\n if (/electron/i.test(appVersion.value))\n return BotKind.Electron;\n if (/slimerjs/i.test(appVersion.value))\n return BotKind.SlimerJS;\n}\n\nfunction arrayIncludes(arr, value) {\n return arr.indexOf(value) !== -1;\n}\nfunction strIncludes(str, value) {\n return str.indexOf(value) !== -1;\n}\nfunction arrayFind(array, callback) {\n if ('find' in array)\n return array.find(callback);\n for (var i = 0; i < array.length; i++) {\n if (callback(array[i], i, array))\n return array[i];\n }\n return undefined;\n}\n\nfunction getObjectProps(obj) {\n return Object.getOwnPropertyNames(obj);\n}\nfunction includes(arr) {\n var keys = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n keys[_i - 1] = arguments[_i];\n }\n var _loop_1 = function (key) {\n if (typeof key === 'string') {\n if (arrayIncludes(arr, key))\n return { value: true };\n }\n else {\n var match = arrayFind(arr, function (value) { return key.test(value); });\n if (match != null)\n return { value: true };\n }\n };\n for (var _a = 0, keys_1 = keys; _a < keys_1.length; _a++) {\n var key = keys_1[_a];\n var state_1 = _loop_1(key);\n if (typeof state_1 === \"object\")\n return state_1.value;\n }\n return false;\n}\nfunction countTruthy(values) {\n return values.reduce(function (sum, value) { return sum + (value ? 1 : 0); }, 0);\n}\n\nfunction detectDocumentAttributes(_a) {\n var documentElementKeys = _a.documentElementKeys;\n if (documentElementKeys.state !== 0 /* State.Success */)\n return false;\n if (includes(documentElementKeys.value, 'selenium', 'webdriver', 'driver')) {\n return BotKind.Selenium;\n }\n}\n\nfunction detectErrorTrace(_a) {\n var errorTrace = _a.errorTrace;\n if (errorTrace.state !== 0 /* State.Success */)\n return false;\n if (/PhantomJS/i.test(errorTrace.value))\n return BotKind.PhantomJS;\n}\n\nfunction detectEvalLengthInconsistency(_a) {\n var evalLength = _a.evalLength, browserKind = _a.browserKind, browserEngineKind = _a.browserEngineKind;\n if (evalLength.state !== 0 /* State.Success */ ||\n browserKind.state !== 0 /* State.Success */ ||\n browserEngineKind.state !== 0 /* State.Success */)\n return;\n var length = evalLength.value;\n if (browserEngineKind.value === \"unknown\" /* BrowserEngineKind.Unknown */)\n return false;\n return ((length === 37 && !arrayIncludes([\"webkit\" /* BrowserEngineKind.Webkit */, \"gecko\" /* BrowserEngineKind.Gecko */], browserEngineKind.value)) ||\n (length === 39 && !arrayIncludes([\"internet_explorer\" /* BrowserKind.IE */], browserKind.value)) ||\n (length === 33 && !arrayIncludes([\"chromium\" /* BrowserEngineKind.Chromium */], browserEngineKind.value)));\n}\n\nfunction detectFunctionBind(_a) {\n var functionBind = _a.functionBind;\n if (functionBind.state === -2 /* State.NotFunction */)\n return BotKind.PhantomJS;\n}\n\nfunction detectLanguagesLengthInconsistency(_a) {\n var languages = _a.languages;\n if (languages.state === 0 /* State.Success */ && languages.value.length === 0) {\n return BotKind.HeadlessChrome;\n }\n}\n\nfunction detectMimeTypesConsistent(_a) {\n var mimeTypesConsistent = _a.mimeTypesConsistent;\n if (mimeTypesConsistent.state === 0 /* State.Success */ && !mimeTypesConsistent.value) {\n return BotKind.Unknown;\n }\n}\n\nfunction detectNotificationPermissions(_a) {\n var notificationPermissions = _a.notificationPermissions, browserKind = _a.browserKind;\n if (browserKind.state !== 0 /* State.Success */ || browserKind.value !== \"chrome\" /* BrowserKind.Chrome */)\n return false;\n if (notificationPermissions.state === 0 /* State.Success */ && notificationPermissions.value) {\n return BotKind.HeadlessChrome;\n }\n}\n\nfunction detectPluginsArray(_a) {\n var pluginsArray = _a.pluginsArray;\n if (pluginsArray.state === 0 /* State.Success */ && !pluginsArray.value)\n return BotKind.HeadlessChrome;\n}\n\nfunction detectPluginsLengthInconsistency(_a) {\n var pluginsLength = _a.pluginsLength, android = _a.android, browserKind = _a.browserKind, browserEngineKind = _a.browserEngineKind;\n if (pluginsLength.state !== 0 /* State.Success */ ||\n android.state !== 0 /* State.Success */ ||\n browserKind.state !== 0 /* State.Success */ ||\n browserEngineKind.state !== 0 /* State.Success */)\n return;\n if (browserKind.value !== \"chrome\" /* BrowserKind.Chrome */ ||\n android.value ||\n browserEngineKind.value !== \"chromium\" /* BrowserEngineKind.Chromium */)\n return;\n if (pluginsLength.value === 0)\n return BotKind.HeadlessChrome;\n}\n\nfunction detectProcess(_a) {\n var _b;\n var process = _a.process;\n if (process.state !== 0 /* State.Success */)\n return false;\n if (process.value.type === 'renderer' || ((_b = process.value.versions) === null || _b === void 0 ? void 0 : _b.electron) != null)\n return BotKind.Electron;\n}\n\nfunction detectProductSub(_a) {\n var productSub = _a.productSub, browserKind = _a.browserKind;\n if (productSub.state !== 0 /* State.Success */ || browserKind.state !== 0 /* State.Success */)\n return false;\n if ((browserKind.value === \"chrome\" /* BrowserKind.Chrome */ ||\n browserKind.value === \"safari\" /* BrowserKind.Safari */ ||\n browserKind.value === \"opera\" /* BrowserKind.Opera */ ||\n browserKind.value === \"wechat\" /* BrowserKind.WeChat */) &&\n productSub.value !== '20030107')\n return BotKind.Unknown;\n}\n\nfunction detectUserAgent(_a) {\n var userAgent = _a.userAgent;\n if (userAgent.state !== 0 /* State.Success */)\n return false;\n if (/PhantomJS/i.test(userAgent.value))\n return BotKind.PhantomJS;\n if (/Headless/i.test(userAgent.value))\n return BotKind.HeadlessChrome;\n if (/Electron/i.test(userAgent.value))\n return BotKind.Electron;\n if (/slimerjs/i.test(userAgent.value))\n return BotKind.SlimerJS;\n}\n\nfunction detectWebDriver(_a) {\n var webDriver = _a.webDriver;\n if (webDriver.state === 0 /* State.Success */ && webDriver.value)\n return BotKind.HeadlessChrome;\n}\n\nfunction detectWebGL(_a) {\n var webGL = _a.webGL;\n if (webGL.state === 0 /* State.Success */) {\n var _b = webGL.value, vendor = _b.vendor, renderer = _b.renderer;\n if (vendor == 'Brian Paul' && renderer == 'Mesa OffScreen') {\n return BotKind.HeadlessChrome;\n }\n }\n}\n\nfunction detectWindowExternal(_a) {\n var windowExternal = _a.windowExternal;\n if (windowExternal.state !== 0 /* State.Success */)\n return false;\n if (/Sequentum/i.test(windowExternal.value))\n return BotKind.Sequentum;\n}\n\nfunction detectWindowSize(_a) {\n var windowSize = _a.windowSize, documentFocus = _a.documentFocus;\n if (windowSize.state !== 0 /* State.Success */ || documentFocus.state !== 0 /* State.Success */)\n return false;\n var _b = windowSize.value, outerWidth = _b.outerWidth, outerHeight = _b.outerHeight;\n // When a page is opened in a new tab without focusing it right away, the window outer size is 0x0\n if (!documentFocus.value)\n return;\n if (outerWidth === 0 && outerHeight === 0)\n return BotKind.HeadlessChrome;\n}\n\nfunction detectDistinctiveProperties(_a) {\n var distinctiveProps = _a.distinctiveProps;\n if (distinctiveProps.state !== 0 /* State.Success */)\n return false;\n var value = distinctiveProps.value;\n var bot;\n for (bot in value)\n if (value[bot])\n return bot;\n}\n\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nvar detectors = {\n detectAppVersion: detectAppVersion,\n detectDocumentAttributes: detectDocumentAttributes,\n detectErrorTrace: detectErrorTrace,\n detectEvalLengthInconsistency: detectEvalLengthInconsistency,\n detectFunctionBind: detectFunctionBind,\n detectLanguagesLengthInconsistency: detectLanguagesLengthInconsistency,\n detectNotificationPermissions: detectNotificationPermissions,\n detectPluginsArray: detectPluginsArray,\n detectPluginsLengthInconsistency: detectPluginsLengthInconsistency,\n detectProcess: detectProcess,\n detectUserAgent: detectUserAgent,\n detectWebDriver: detectWebDriver,\n detectWebGL: detectWebGL,\n detectWindowExternal: detectWindowExternal,\n detectWindowSize: detectWindowSize,\n detectMimeTypesConsistent: detectMimeTypesConsistent,\n detectProductSub: detectProductSub,\n detectDistinctiveProperties: detectDistinctiveProperties,\n};\n\nfunction getAppVersion() {\n var appVersion = navigator.appVersion;\n if (appVersion == undefined) {\n throw new BotdError(-1 /* State.Undefined */, 'navigator.appVersion is undefined');\n }\n return appVersion;\n}\n\nfunction getDocumentElementKeys() {\n if (document.documentElement === undefined) {\n throw new BotdError(-1 /* State.Undefined */, 'document.documentElement is undefined');\n }\n var documentElement = document.documentElement;\n if (typeof documentElement.getAttributeNames !== 'function') {\n throw new BotdError(-2 /* State.NotFunction */, 'document.documentElement.getAttributeNames is not a function');\n }\n return documentElement.getAttributeNames();\n}\n\nfunction getErrorTrace() {\n try {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n null[0]();\n }\n catch (error) {\n if (error instanceof Error && error['stack'] != null) {\n return error.stack.toString();\n }\n }\n throw new BotdError(-3 /* State.UnexpectedBehaviour */, 'errorTrace signal unexpected behaviour');\n}\n\nfunction getEvalLength() {\n return eval.toString().length;\n}\n\nfunction getFunctionBind() {\n if (Function.prototype.bind === undefined) {\n throw new BotdError(-2 /* State.NotFunction */, 'Function.prototype.bind is undefined');\n }\n return Function.prototype.bind.toString();\n}\n\nfunction getBrowserEngineKind() {\n var _a, _b;\n // Based on research in October 2020. Tested to detect Chromium 42-86.\n var w = window;\n var n = navigator;\n if (countTruthy([\n 'webkitPersistentStorage' in n,\n 'webkitTemporaryStorage' in n,\n n.vendor.indexOf('Google') === 0,\n 'webkitResolveLocalFileSystemURL' in w,\n 'BatteryManager' in w,\n 'webkitMediaStream' in w,\n 'webkitSpeechGrammar' in w,\n ]) >= 5) {\n return \"chromium\" /* BrowserEngineKind.Chromium */;\n }\n if (countTruthy([\n 'ApplePayError' in w,\n 'CSSPrimitiveValue' in w,\n 'Counter' in w,\n n.vendor.indexOf('Apple') === 0,\n 'getStorageUpdates' in n,\n 'WebKitMediaKeys' in w,\n ]) >= 4) {\n return \"webkit\" /* BrowserEngineKind.Webkit */;\n }\n if (countTruthy([\n 'buildID' in navigator,\n 'MozAppearance' in ((_b = (_a = document.documentElement) === null || _a === void 0 ? void 0 : _a.style) !== null && _b !== void 0 ? _b : {}),\n 'onmozfullscreenchange' in w,\n 'mozInnerScreenX' in w,\n 'CSSMozDocumentRule' in w,\n 'CanvasCaptureMediaStream' in w,\n ]) >= 4) {\n return \"gecko\" /* BrowserEngineKind.Gecko */;\n }\n return \"unknown\" /* BrowserEngineKind.Unknown */;\n}\nfunction getBrowserKind() {\n var _a;\n var userAgent = (_a = navigator.userAgent) === null || _a === void 0 ? void 0 : _a.toLowerCase();\n if (strIncludes(userAgent, 'edg/')) {\n return \"edge\" /* BrowserKind.Edge */;\n }\n else if (strIncludes(userAgent, 'trident') || strIncludes(userAgent, 'msie')) {\n return \"internet_explorer\" /* BrowserKind.IE */;\n }\n else if (strIncludes(userAgent, 'wechat')) {\n return \"wechat\" /* BrowserKind.WeChat */;\n }\n else if (strIncludes(userAgent, 'firefox')) {\n return \"firefox\" /* BrowserKind.Firefox */;\n }\n else if (strIncludes(userAgent, 'opera') || strIncludes(userAgent, 'opr')) {\n return \"opera\" /* BrowserKind.Opera */;\n }\n else if (strIncludes(userAgent, 'chrome')) {\n return \"chrome\" /* BrowserKind.Chrome */;\n }\n else if (strIncludes(userAgent, 'safari')) {\n return \"safari\" /* BrowserKind.Safari */;\n }\n else {\n return \"unknown\" /* BrowserKind.Unknown */;\n }\n}\n// Source: https://github.com/fingerprintjs/fingerprintjs/blob/master/src/utils/browser.ts#L223\nfunction isAndroid() {\n var browserEngineKind = getBrowserEngineKind();\n var isItChromium = browserEngineKind === \"chromium\" /* BrowserEngineKind.Chromium */;\n var isItGecko = browserEngineKind === \"gecko\" /* BrowserEngineKind.Gecko */;\n // Only 2 browser engines are presented on Android.\n // Actually, there is also Android 4.1 browser, but it's not worth detecting it at the moment.\n if (!isItChromium && !isItGecko)\n return false;\n var w = window;\n // Chrome removes all words \"Android\" from `navigator` when desktop version is requested\n // Firefox keeps \"Android\" in `navigator.appVersion` when desktop version is requested\n return (countTruthy([\n 'onorientationchange' in w,\n 'orientation' in w,\n isItChromium && !('SharedWorker' in w),\n isItGecko && /android/i.test(navigator.appVersion),\n ]) >= 2);\n}\nfunction getDocumentFocus() {\n if (document.hasFocus === undefined) {\n return false;\n }\n return document.hasFocus();\n}\nfunction isChromium86OrNewer() {\n // Checked in Chrome 85 vs Chrome 86 both on desktop and Android\n var w = window;\n return (countTruthy([\n !('MediaSettingsRange' in w),\n 'RTCEncodedAudioFrame' in w,\n '' + w.Intl === '[object Intl]',\n '' + w.Reflect === '[object Reflect]',\n ]) >= 3);\n}\n\nfunction getLanguages() {\n var n = navigator;\n var result = [];\n var language = n.language || n.userLanguage || n.browserLanguage || n.systemLanguage;\n if (language !== undefined) {\n result.push([language]);\n }\n if (Array.isArray(n.languages)) {\n var browserEngine = getBrowserEngineKind();\n // Starting from Chromium 86, there is only a single value in `navigator.language` in Incognito mode:\n // the value of `navigator.language`. Therefore, the value is ignored in this browser.\n if (!(browserEngine === \"chromium\" /* BrowserEngineKind.Chromium */ && isChromium86OrNewer())) {\n result.push(n.languages);\n }\n }\n else if (typeof n.languages === 'string') {\n var languages = n.languages;\n if (languages) {\n result.push(languages.split(','));\n }\n }\n return result;\n}\n\nfunction areMimeTypesConsistent() {\n if (navigator.mimeTypes === undefined) {\n throw new BotdError(-1 /* State.Undefined */, 'navigator.mimeTypes is undefined');\n }\n var mimeTypes = navigator.mimeTypes;\n var isConsistent = Object.getPrototypeOf(mimeTypes) === MimeTypeArray.prototype;\n for (var i = 0; i < mimeTypes.length; i++) {\n isConsistent && (isConsistent = Object.getPrototypeOf(mimeTypes[i]) === MimeType.prototype);\n }\n return isConsistent;\n}\n\nfunction getNotificationPermissions() {\n return __awaiter(this, void 0, void 0, function () {\n var permissions, permissionStatus;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n if (window.Notification === undefined) {\n throw new BotdError(-1 /* State.Undefined */, 'window.Notification is undefined');\n }\n if (navigator.permissions === undefined) {\n throw new BotdError(-1 /* State.Undefined */, 'navigator.permissions is undefined');\n }\n permissions = navigator.permissions;\n if (typeof permissions.query !== 'function') {\n throw new BotdError(-2 /* State.NotFunction */, 'navigator.permissions.query is not a function');\n }\n _a.label = 1;\n case 1:\n _a.trys.push([1, 3, , 4]);\n return [4 /*yield*/, permissions.query({ name: 'notifications' })];\n case 2:\n permissionStatus = _a.sent();\n return [2 /*return*/, window.Notification.permission === 'denied' && permissionStatus.state === 'prompt'];\n case 3:\n _a.sent();\n throw new BotdError(-3 /* State.UnexpectedBehaviour */, 'notificationPermissions signal unexpected behaviour');\n case 4: return [2 /*return*/];\n }\n });\n });\n}\n\nfunction getPluginsArray() {\n if (navigator.plugins === undefined) {\n throw new BotdError(-1 /* State.Undefined */, 'navigator.plugins is undefined');\n }\n if (window.PluginArray === undefined) {\n throw new BotdError(-1 /* State.Undefined */, 'window.PluginArray is undefined');\n }\n return navigator.plugins instanceof PluginArray;\n}\n\nfunction getPluginsLength() {\n if (navigator.plugins === undefined) {\n throw new BotdError(-1 /* State.Undefined */, 'navigator.plugins is undefined');\n }\n if (navigator.plugins.length === undefined) {\n throw new BotdError(-3 /* State.UnexpectedBehaviour */, 'navigator.plugins.length is undefined');\n }\n return navigator.plugins.length;\n}\n\nfunction getProcess() {\n var process = window.process;\n var errorPrefix = 'window.process is';\n if (process === undefined) {\n throw new BotdError(-1 /* State.Undefined */, \"\".concat(errorPrefix, \" undefined\"));\n }\n if (process && typeof process !== 'object') {\n throw new BotdError(-3 /* State.UnexpectedBehaviour */, \"\".concat(errorPrefix, \" not an object\"));\n }\n return process;\n}\n\nfunction getProductSub() {\n var productSub = navigator.productSub;\n if (productSub === undefined) {\n throw new BotdError(-1 /* State.Undefined */, 'navigator.productSub is undefined');\n }\n return productSub;\n}\n\nfunction getRTT() {\n if (navigator.connection === undefined) {\n throw new BotdError(-1 /* State.Undefined */, 'navigator.connection is undefined');\n }\n if (navigator.connection.rtt === undefined) {\n throw new BotdError(-1 /* State.Undefined */, 'navigator.connection.rtt is undefined');\n }\n return navigator.connection.rtt;\n}\n\nfunction getUserAgent() {\n return navigator.userAgent;\n}\n\nfunction getWebDriver() {\n if (navigator.webdriver == undefined) {\n throw new BotdError(-1 /* State.Undefined */, 'navigator.webdriver is undefined');\n }\n return navigator.webdriver;\n}\n\nfunction getWebGL() {\n var canvasElement = document.createElement('canvas');\n if (typeof canvasElement.getContext !== 'function') {\n throw new BotdError(-2 /* State.NotFunction */, 'HTMLCanvasElement.getContext is not a function');\n }\n var webGLContext = canvasElement.getContext('webgl');\n if (webGLContext === null) {\n throw new BotdError(-4 /* State.Null */, 'WebGLRenderingContext is null');\n }\n if (typeof webGLContext.getParameter !== 'function') {\n throw new BotdError(-2 /* State.NotFunction */, 'WebGLRenderingContext.getParameter is not a function');\n }\n var vendor = webGLContext.getParameter(webGLContext.VENDOR);\n var renderer = webGLContext.getParameter(webGLContext.RENDERER);\n return { vendor: vendor, renderer: renderer };\n}\n\nfunction getWindowExternal() {\n if (window.external === undefined) {\n throw new BotdError(-1 /* State.Undefined */, 'window.external is undefined');\n }\n var external = window.external;\n if (typeof external.toString !== 'function') {\n throw new BotdError(-2 /* State.NotFunction */, 'window.external.toString is not a function');\n }\n return external.toString();\n}\n\nfunction getWindowSize() {\n return {\n outerWidth: window.outerWidth,\n outerHeight: window.outerHeight,\n innerWidth: window.innerWidth,\n innerHeight: window.innerHeight,\n };\n}\n\nfunction checkDistinctiveProperties() {\n var _a;\n // The order in the following list matters, because specific types of bots come first, followed by automation technologies.\n var distinctivePropsList = (_a = {},\n _a[BotKind.Awesomium] = {\n window: ['awesomium'],\n },\n _a[BotKind.Cef] = {\n window: ['RunPerfTest'],\n },\n _a[BotKind.CefSharp] = {\n window: ['CefSharp'],\n },\n _a[BotKind.CoachJS] = {\n window: ['emit'],\n },\n _a[BotKind.FMiner] = {\n window: ['fmget_targets'],\n },\n _a[BotKind.Geb] = {\n window: ['geb'],\n },\n _a[BotKind.NightmareJS] = {\n window: ['__nightmare', 'nightmare'],\n },\n _a[BotKind.Phantomas] = {\n window: ['__phantomas'],\n },\n _a[BotKind.PhantomJS] = {\n window: ['callPhantom', '_phantom'],\n },\n _a[BotKind.Rhino] = {\n window: ['spawn'],\n },\n _a[BotKind.Selenium] = {\n window: ['_Selenium_IDE_Recorder', '_selenium', 'calledSelenium', /^([a-z]){3}_.*_(Array|Promise|Symbol)$/],\n document: ['__selenium_evaluate', 'selenium-evaluate', '__selenium_unwrapped'],\n },\n _a[BotKind.WebDriverIO] = {\n window: ['wdioElectron'],\n },\n _a[BotKind.WebDriver] = {\n window: [\n 'webdriver',\n '__webdriverFunc',\n '__lastWatirAlert',\n '__lastWatirConfirm',\n '__lastWatirPrompt',\n '_WEBDRIVER_ELEM_CACHE',\n 'ChromeDriverw',\n ],\n document: [\n '__webdriver_script_fn',\n '__driver_evaluate',\n '__webdriver_evaluate',\n '__fxdriver_evaluate',\n '__driver_unwrapped',\n '__webdriver_unwrapped',\n '__fxdriver_unwrapped',\n '__webdriver_script_fn',\n '__webdriver_script_func',\n '__webdriver_script_function',\n '$cdc_asdjflasutopfhvcZLmcf',\n '$cdc_asdjflasutopfhvcZLmcfl_',\n '$chrome_asyncScriptInfo',\n '__$webdriverAsyncExecutor',\n ],\n },\n _a[BotKind.HeadlessChrome] = {\n window: ['domAutomation', 'domAutomationController'],\n },\n _a);\n var botName;\n var result = {};\n var windowProps = getObjectProps(window);\n var documentProps = [];\n if (window.document !== undefined)\n documentProps = getObjectProps(window.document);\n for (botName in distinctivePropsList) {\n var props = distinctivePropsList[botName];\n if (props !== undefined) {\n var windowContains = props.window === undefined ? false : includes.apply(void 0, __spreadArray([windowProps], props.window, false));\n var documentContains = props.document === undefined || !documentProps.length ? false : includes.apply(void 0, __spreadArray([documentProps], props.document, false));\n result[botName] = windowContains || documentContains;\n }\n }\n return result;\n}\n\nvar sources = {\n android: isAndroid,\n browserKind: getBrowserKind,\n browserEngineKind: getBrowserEngineKind,\n documentFocus: getDocumentFocus,\n userAgent: getUserAgent,\n appVersion: getAppVersion,\n rtt: getRTT,\n windowSize: getWindowSize,\n pluginsLength: getPluginsLength,\n pluginsArray: getPluginsArray,\n errorTrace: getErrorTrace,\n productSub: getProductSub,\n windowExternal: getWindowExternal,\n mimeTypesConsistent: areMimeTypesConsistent,\n evalLength: getEvalLength,\n webGL: getWebGL,\n webDriver: getWebDriver,\n languages: getLanguages,\n notificationPermissions: getNotificationPermissions,\n documentElementKeys: getDocumentElementKeys,\n functionBind: getFunctionBind,\n process: getProcess,\n distinctiveProps: checkDistinctiveProperties,\n};\n\n/**\n * Class representing a bot detector.\n *\n * @class\n * @implements {BotDetectorInterface}\n */\nvar BotDetector = /** @class */ (function () {\n function BotDetector() {\n this.components = undefined;\n this.detections = undefined;\n }\n BotDetector.prototype.getComponents = function () {\n return this.components;\n };\n BotDetector.prototype.getDetections = function () {\n return this.detections;\n };\n /**\n * @inheritdoc\n */\n BotDetector.prototype.detect = function () {\n if (this.components === undefined) {\n throw new Error(\"BotDetector.detect can't be called before BotDetector.collect\");\n }\n var _a = detect(this.components, detectors), detections = _a[0], finalDetection = _a[1];\n this.detections = detections;\n return finalDetection;\n };\n /**\n * @inheritdoc\n */\n BotDetector.prototype.collect = function () {\n return __awaiter(this, void 0, void 0, function () {\n var _a;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n _a = this;\n return [4 /*yield*/, collect(sources)];\n case 1:\n _a.components = _b.sent();\n return [2 /*return*/, this.components];\n }\n });\n });\n };\n return BotDetector;\n}());\n\n/**\n * Sends an unpersonalized AJAX request to collect installation statistics\n */\nfunction monitor() {\n // The FingerprintJS CDN (https://github.com/fingerprintjs/cdn) replaces `window.__fpjs_d_m` with `true`\n if (window.__fpjs_d_m || Math.random() >= 0.001) {\n return;\n }\n try {\n var request = new XMLHttpRequest();\n request.open('get', \"https://m1.openfpcdn.io/botd/v\".concat(version, \"/npm-monitoring\"), true);\n request.send();\n }\n catch (error) {\n // console.error is ok here because it's an unexpected error handler\n // eslint-disable-next-line no-console\n console.error(error);\n }\n}\nfunction load(_a) {\n var _b = _a === void 0 ? {} : _a, _c = _b.monitoring, monitoring = _c === void 0 ? true : _c;\n return __awaiter(this, void 0, void 0, function () {\n var detector;\n return __generator(this, function (_d) {\n switch (_d.label) {\n case 0:\n if (monitoring) {\n monitor();\n }\n detector = new BotDetector();\n return [4 /*yield*/, detector.collect()];\n case 1:\n _d.sent();\n return [2 /*return*/, detector];\n }\n });\n });\n}\nvar index = { load: load };\n\nexport { BotKind, BotdError, collect, index as default, detect, detectors, load, sources };\n","import { load } from \"@fingerprintjs/botd\";\n\nasync function botDetection() {\n try {\n const botd = await load();\n const result = botd.detect();\n\n\n if (result.bot) {\n return {\n status: true,\n botKind: result.botKind,\n };\n } else {\n return {\n status: false,\n };\n }\n } catch (error) {\n console.error(error);\n return null;\n }\n}\n\nexport { botDetection };\n","// Enhanced browser detection with multiple techniques\ntype BrowserDetails = {\n name: string;\n version: string;\n confidence: number; // 0-100 score of detection confidence\n engine: string;\n};\n\n/**\n * Detect browser using multiple techniques to be resilient against spoofing and user agent changes\n */\nexport function getBrowserName(): string {\n const details = detectBrowser();\n return details.name;\n}\n\n/**\n * Enhanced browser detection that uses multiple techniques to identify the browser\n * with high confidence even when user agent is spoofed or in mobile simulation mode\n */\nexport function detectBrowser(): BrowserDetails {\n // Default result with low confidence\n const result: BrowserDetails = {\n name: \"Unknown\",\n version: \"Unknown\",\n confidence: 0,\n engine: \"Unknown\",\n };\n\n // Collection of detection results with confidence scores\n const detections: { name: string; confidence: number }[] = [];\n\n // First check for Edge in user agent (this is a fast check before other more intensive checks)\n const ua = navigator.userAgent.toLowerCase();\n if (ua.indexOf(\"edg/\") !== -1 || ua.indexOf(\"edge/\") !== -1) {\n detections.push({ name: \"Edge\", confidence: 75 });\n }\n\n // 1. Engine detection based on error messages (more reliable than UA)\n const engineSignatures = getEngineSignatures();\n detectByEngineSignatures(detections, engineSignatures);\n\n // 2. Feature detection for specific browsers\n detectByFeatures(detections);\n\n // 3. Protocol handler detection\n detectByProtocolHandlers(detections);\n\n // 4. CSS property detection\n detectByCssProperties(detections);\n\n // 5. Performance timing\n detectByPerformance(detections);\n\n // 6. JavaScript behavior patterns\n detectByJsBehavior(detections);\n\n // 7. Edge-specific detection - separate function to better differentiate Edge from Chrome\n detectEdgeBrowser(detections);\n\n // 8. Chrome-specific detection - enhanced Chrome detection\n detectChromeBrowser(detections);\n\n // 9. Brave-specific detection - get specific Brave signals\n detectBraveBrowser(detections);\n\n // Combine all detection results and calculate final browser with confidence\n if (detections.length > 0) {\n // Group by browser name and sum confidence\n const grouped = detections.reduce((acc, curr) => {\n acc[curr.name] = (acc[curr.name] || 0) + curr.confidence;\n return acc;\n }, {} as Record<string, number>);\n\n // Find the browser with highest confidence\n let maxConfidence = 0;\n let detectedBrowser = \"Unknown\";\n\n for (const [browser, confidence] of Object.entries(grouped)) {\n if (confidence > maxConfidence) {\n maxConfidence = confidence;\n detectedBrowser = browser;\n }\n }\n\n // Extra Edge check - check if incognito detection can confirm this is Edge\n if (detectedBrowser === \"Chrome\" && isActuallyEdge()) {\n detectedBrowser = \"Edge\";\n }\n\n result.name = detectedBrowser;\n result.confidence = Math.min(100, maxConfidence);\n\n // Set engine based on browser\n if ([\"Chrome\", \"Edge\", \"Opera\", \"Brave\"].includes(detectedBrowser)) {\n result.engine = \"Blink\";\n } else if (detectedBrowser === \"Firefox\") {\n result.engine = \"Gecko\";\n } else if (detectedBrowser === \"Safari\") {\n result.engine = \"WebKit\";\n }\n\n // Try to extract version\n result.version = getBrowserVersion(detectedBrowser);\n }\n\n return result;\n}\n\n/**\n * Special detection for Brave browser\n */\nfunction detectBraveBrowser(\n detections: { name: string; confidence: number }[]\n): void {\n try {\n // Check for Brave API directly\n if ((navigator as any).brave) {\n detections.push({ name: \"Brave\", confidence: 95 });\n return;\n }\n\n // Check for specific Brave patterns in the user agent\n const ua = navigator.userAgent;\n if (ua.includes(\"Brave\") || ua.includes(\"brave\")) {\n detections.push({ name: \"Brave\", confidence: 90 });\n return;\n }\n\n // Brave specific behavior checks\n // 1. Brave removes certain tracking headers\n // 2. Brave blocks fingerprinting by default\n // 3. Brave has specific privacy features\n\n // Check for Chrome without Google Chrome-specific features\n if (\n typeof (window as any).chrome !== \"undefined\" &&\n (window as any).chrome.runtime &&\n !(window as any).google\n ) {\n // Additional check for absence of Chrome-specific features\n const hasNoChromeFeatures =\n !(\"google\" in window) &&\n !(window as any).chrome.webstore &&\n typeof (navigator as any).brave !== \"undefined\";\n\n if (hasNoChromeFeatures) {\n detections.push({ name: \"Brave\", confidence: 60 });\n }\n }\n } catch (e) {\n // Ignore detection errors\n }\n}\n\n/**\n * Specific check to determine if a browser is Edge by using the same techniques\n * that incognito detection uses, which seems to report Edge correctly\n */\nfunction isActuallyEdge(): boolean {\n try {\n // Check user agent for Edge keywords\n const ua = navigator.userAgent.toLowerCase();\n if (ua.indexOf(\"edg/\") !== -1 || ua.indexOf(\"edge/\") !== -1) {\n return true;\n }\n\n // Check if any MS-specific APIs or DOM elements are available\n if (\n (window as any).msCredentials ||\n (document as any).documentMode ||\n typeof (window as any).MSInputMethodContext !== \"undefined\" ||\n typeof (navigator as any).msLaunchUri === \"function\"\n ) {\n return true;\n }\n\n // Check Edge-specific combination of features\n if (\n typeof (window as any).chrome !== \"undefined\" &&\n (window as any).chrome.runtime &&\n !(window as any).chrome.webstore &&\n !(window as any).opr &&\n !(window as any).opera\n ) {\n // Additional Edge-specific check\n try {\n // Edge typically does not have the Chrome PDF viewer plugin\n const hasChromePdfViewer = Array.from(navigator.plugins).some(\n (plugin) => plugin.name === \"Chrome PDF Viewer\"\n );\n\n // Check for unique Edge plugin patterns\n const hasEdgePluginPattern = Array.from(navigator.plugins).some(\n (plugin) => plugin.name.indexOf(\"Edge\") !== -1\n );\n\n if (!hasChromePdfViewer || hasEdgePluginPattern) {\n return true;\n }\n } catch (e) {\n // Plugin check failed\n }\n }\n\n return false;\n } catch (e) {\n return false;\n }\n}\n\n/**\n * Gets browser error behavior signature from various engine-specific behaviors\n */\nfunction getEngineSignatures(): {\n toFixedErrorLength: number;\n functionToStringLength: number;\n} {\n // Error message length from toFixed with negative values\n let toFixedErrorLength = 0;\n try {\n const neg = parseInt(\"-1\");\n neg.toFixed(neg);\n } catch (e: any) {\n toFixedErrorLength = e.message.length;\n }\n\n // Function.toString() behavior - varies by browser\n let functionToStringLength = 0;\n try {\n functionToStringLength = Function.prototype.toString.call(Function).length;\n } catch (e) {\n // Ignore error\n }\n\n return {\n toFixedErrorLength,\n functionToStringLength,\n };\n}\n\n/**\n * Detects browsers based on engine-specific error message patterns\n */\nfunction detectByEngineSignatures(\n detections: { name: string; confidence: number }[],\n signatures: { toFixedErrorLength: number; functionToStringLength: number }\n): void {\n // Safari typically has error message length of 44\n if (signatures.toFixedErrorLength === 44) {\n detections.push({ name: \"Safari\", confidence: 40 });\n }\n\n // Chrome typically has error message length of 51\n else if (signatures.toFixedErrorLength === 51) {\n detections.push({ name: \"Chrome\", confidence: 30 }); // Increased from 15\n }\n\n // Firefox typically has error message length of 25\n else if (signatures.toFixedErrorLength === 25) {\n detections.push({ name: \"Firefox\", confidence: 30 });\n }\n\n // Function.toString length can help differentiate browsers too\n if (\n signatures.functionToStringLength > 30 &&\n signatures.functionToStringLength < 40\n ) {\n detections.push({ name: \"Firefox\", confidence: 10 });\n } else if (signatures.functionToStringLength > 40) {\n detections.push({ name: \"Chrome\", confidence: 15 }); // Increased from 5\n }\n}\n\n/**\n * Detects browser by checking for browser-specific features and APIs\n */\nfunction detectByFeatures(\n detections: { name: string; confidence: number }[]\n): void {\n // Brave detection\n if (\n (navigator as any).brave &&\n typeof (navigator as any).brave.isBrave === \"function\"\n ) {\n detections.push({ name: \"Brave\", confidence: 90 });\n }\n\n // Check for Chrome-specific APIs\n if (\n typeof (window as any).chrome !== \"undefined\" &&\n (window as any).chrome.app &&\n (window as any).chrome.runtime\n ) {\n // First check if it's not actually Edge\n const ua = navigator.userAgent.toLowerCase();\n if (ua.indexOf(\"edg/\") === -1 && ua.indexOf(\"edge/\") === -1) {\n if ((navigator as any).brave === undefined) {\n detections.push({ name: \"Chrome\", confidence: 40 }); // Increased from 25\n }\n } else {\n // This is more likely Edge than Chrome\n detections.push({ name: \"Edge\", confidence: 40 });\n }\n }\n\n // Additional Chrome-specific feature detection\n if (\n (window as any).chrome &&\n (window as any).chrome.csi &&\n (window as any).chrome.loadTimes &&\n !(window as any).opr &&\n !(window as any).opera &&\n !(\n (navigator as any).brave &&\n typeof (navigator as any).brave.isBrave === \"function\"\n )\n ) {\n // These features are very specific to Chrome and not present in most other Chromium browsers\n detections.push({ name: \"Chrome\", confidence: 60 });\n }\n\n // Firefox-specific objects\n if (\n typeof (window as any).InstallTrigger !== \"undefined\" ||\n typeof (window as any).sidebar !== \"undefined\"\n ) {\n detections.push({ name: \"Firefox\", confidence: 70 });\n }\n\n // Safari detection\n if (\n /constructor/i.test((window as any).HTMLElement as any) ||\n (function (p) {\n return p.toString() === \"[object SafariRemoteNotification]\";\n })(\n !(typeof (window as any).safari === \"undefined\") &&\n (window as any).safari.pushNotification\n )\n ) {\n detections.push({ name: \"Safari\", confidence: 70 });\n }\n\n // Basic Edge detection - more detailed in detectEdgeBrowser function\n if ((window as any).msCredentials || (document as any).documentMode) {\n detections.push({ name: \"Edge\", confidence: 60 }); // Increased confidence\n }\n\n // Opera detection\n if ((window as any).opr || (window as any).opera) {\n detections.push({ name: \"Opera\", confidence: 60 });\n }\n}\n\n/**\n * Detects browser by checking for browser-specific protocol handlers\n */\nfunction detectByProtocolHandlers(\n detections: { name: string; confidence: number }[]\n): void {\n // Chrome/Chromium protocols\n if (typeof navigator.registerProtocolHandler === \"function\") {\n try {\n if (\"chrome\" in (window as any)) {\n // Only consider chrome protocol if not Edge\n const ua = navigator.userAgent.toLowerCase();\n if (ua.indexOf(\"edg/\") === -1 && ua.indexOf(\"edge/\") === -1) {\n detections.push({ name: \"Chrome\", confidence: 25 }); // Increased from 15\n }\n }\n\n // Edge has ms-* protocols available\n if (\n \"ms-access\" in (navigator as any) ||\n \"ms-browser-extension\" in (navigator as any) ||\n \"ms-calculator\" in (navigator as any) ||\n \"ms-drive-to\" in (navigator as any) ||\n \"ms-excel\" in (navigator as any) ||\n \"ms-gamebarservices\" in (navigator as any) ||\n \"ms-search\" in (navigator as any) ||\n \"ms-word\" in (navigator as any)\n ) {\n detections.push({ name: \"Edge\", confidence: 80 }); // Increased confidence\n }\n\n // Opera has specific protocol handlers\n if (\"opr:\" in navigator.plugins || \"opera:\" in navigator.plugins) {\n detections.push({ name: \"Opera\", confidence: 25 });\n }\n } catch (e) {\n // Protocol detection failed\n }\n }\n}\n\n/**\n * Detects browser by checking for browser-specific CSS properties\n */\nfunction detectByCssProperties(\n detections: { name: string; confidence: number }[]\n): void {\n const docStyle = window.getComputedStyle(document.documentElement);\n\n // Webkit-specific properties\n if (\n docStyle.getPropertyValue(\"--apple-trailing-word\") !== \"\" ||\n docStyle.getPropertyValue(\"-webkit-app-region\") !== \"\"\n ) {\n detections.push({ name: \"Safari\", confidence: 20 });\n }\n\n // Firefox-specific properties\n if (\n docStyle.getPropertyValue(\"-moz-context-properties\") !== \"\" ||\n docStyle.getPropertyValue(\"-moz-user-focus\") !== \"\"\n ) {\n detections.push({ name: \"Firefox\", confidence: 20 });\n }\n\n // Edge-specific CSS properties\n if (\n docStyle.getPropertyValue(\"-ms-ime-align\") !== \"\" ||\n docStyle.getPropertyValue(\"-ms-flow-from\") !== \"\"\n ) {\n detections.push({ name: \"Edge\", confidence: 60 }); // Increased confidence\n }\n}\n\n/**\n * Detects browser by analyzing performance characteristics\n */\nfunction detectByPerformance(\n detections: { name: string; confidence: number }[]\n): void {\n // Chrome/Chromium-based browsers expose memory info\n if (\n (performance as any).memory &&\n (performance as any).memory.jsHeapSizeLimit\n ) {\n // Different Chromium browsers have different heap size limits\n const heapLimit = (performance as any).memory.jsHeapSizeLimit;\n\n if (heapLimit > 2000000000) {\n // Check if it's not actually Edge before assuming Chrome\n const ua = navigator.userAgent.toLowerCase();\n if (ua.indexOf(\"edg/\") === -1 && ua.indexOf(\"edge/\") === -1) {\n detections.push({ name: \"Chrome\", confidence: 20 }); // Increased from 10\n }\n }\n }\n\n // Chrome-specific performance timing features\n if (\n typeof (window as any).chrome !== \"undefined\" &&\n typeof (window as any).chrome.loadTimes === \"function\"\n ) {\n try {\n const chromeLoad = (window as any).chrome.loadTimes();\n if (\n chromeLoad &&\n typeof chromeLoad.firstPaintTime === \"number\" &&\n typeof chromeLoad.requestTime === \"number\"\n ) {\n detections.push({ name: \"Chrome\", confidence: 30 });\n }\n } catch (e) {\n // Performance timing check failed\n }\n }\n}\n\n/**\n * Detects browser by JavaScript behavior patterns\n */\nfunction detectByJsBehavior(\n detections: { name: string; confidence: number }[]\n): void {\n // Firefox specific behavior with error stack\n try {\n throw new Error();\n } catch (err: any) {\n if (err.stack && err.stack.indexOf(\"()@\") >= 0) {\n detections.push({ name: \"Firefox\", confidence: 15 });\n }\n\n // Chrome-specific stack trace format\n if (err.stack && err.stack.indexOf(\"at new\") >= 0) {\n // Check if it's not actually Edge\n const ua = navigator.userAgent.toLowerCase();\n if (ua.indexOf(\"edg/\") === -1 && ua.indexOf(\"edge/\") === -1) {\n detections.push({ name: \"Chrome\", confidence: 20 }); // Increased from 10\n }\n }\n\n // Safari-specific stack trace format\n if (\n err.stack &&\n err.stack.indexOf(\"@\") === -1 &&\n err.stack.indexOf(\"at \") === -1\n ) {\n detections.push({ name: \"Safari\", confidence: 15 });\n }\n }\n\n // Brave shields detection\n if (\n document.createElement(\"canvas\").toDataURL().length > 15 &&\n (navigator as any).brave === undefined &&\n typeof (window as any).chrome !== \"undefined\"\n ) {\n // Try to detect if Brave shields are on\n const img = new Image();\n let loadCount = 0;\n\n img.onload = () => {\n loadCount++;\n if (loadCount === 0) {\n detections.push({ name: \"Brave\", confidence: 20 });\n }\n };\n\n img.onerror = () => {\n detections.push({ name: \"Brave\", confidence: 10 });\n };\n\n // Try loading a tracking pixel\n img.src = \"https://www.facebook.com/tr?id=1234567890&ev=PageView\";\n }\n\n // Additional Chrome-specific behavior check (Chrome DevTools Protocol)\n try {\n // Check if __JQUERY_OBJECT__ is defined (used in Chrome Developer Tools)\n // This will throw an error in most other browsers\n const hasDevTools = !!(window as any).__JQUERY_OBJECT__;\n if (hasDevTools) {\n detections.push({ name: \"Chrome\", confidence: 15 });\n }\n } catch (e) {\n // DevTools check failed\n }\n\n // Check Chrome user agent pattern more directly when combined with other Chrome features\n if (\n navigator.userAgent.indexOf(\"Chrome\") !== -1 &&\n navigator.userAgent.indexOf(\"Edg\") === -1 &&\n navigator.userAgent.indexOf(\"OPR\") === -1 &&\n navigator.userAgent.indexOf(\"Brave\") === -1 &&\n typeof (window as any).chrome !== \"undefined\" &&\n (window as any).chrome.runtime\n ) {\n detections.push({ name: \"Chrome\", confidence: 35 });\n }\n}\n\n/**\n * Specialized Edge browser detection to differentiate it from Chrome\n */\nfunction detectEdgeBrowser(\n detections: { name: string; confidence: number }[]\n): void {\n // Check for Edge in User Agent as a supplementary signal (still useful)\n const ua = navigator.userAgent.toLowerCase();\n if (ua.indexOf(\"edg/\") !== -1 || ua.indexOf(\"edge/\") !== -1) {\n detections.push({ name: \"Edge\", confidence: 80 }); // Increased from 30 to 80\n }\n\n // Check for Edge-specific objects\n try {\n // Check for CSS.supports method with -ms vendor prefix\n if (CSS.supports(\"-ms-ime-align\", \"auto\")) {\n detections.push({ name: \"Edge\", confidence: 70 }); // Increased confidence\n }\n } catch (e) {\n // CSS.supports might not be available\n }\n\n // Check for Edge-specific behaviors\n try {\n // Test if msLaunchUri is available (Edge-specific)\n if (typeof (navigator as any).msLaunchUri === \"function\") {\n detections.push({ name: \"Edge\", confidence: 85 }); // Increased confidence\n }\n\n // Test if MS-specific APIs are available\n if (typeof (window as any).MSInputMethodContext !== \"undefined\") {\n detections.push({ name: \"Edge\", confidence: 80 }); // Increased confidence\n }\n\n // Check for Edge-specific storage behavior\n if ((document as any).documentMode || /edge/i.test(navigator.userAgent)) {\n detections.push({ name: \"Edge\", confidence: 75 }); // Increased confidence\n }\n\n // Check window.chrome properties patterns specific to Edge\n if (\n typeof (window as any).chrome !== \"undefined\" &&\n (window as any).chrome.runtime &&\n !(window as any).chrome.webstore\n ) {\n // This combination is more common in Edge than Chrome\n detections.push({ name: \"Edge\", confidence: 60 }); // Increased confidence\n }\n } catch (e) {\n // Ignore errors in detection\n }\n\n // Get text rendering metrics - Edge and Chrome render text differently\n try {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (ctx) {\n canvas.width = 200;\n canvas.height = 50;\n ctx.font = \"20px Arial\";\n ctx.textBaseline = \"top\";\n ctx.fillText(\"EdgeBrowserTest\", 0, 0);\n\n // Get image data to analyze text rendering\n const imageData = ctx.getImageData(\n 0,\n 0,\n canvas.width,\n canvas.height\n ).data;\n\n // Create a simple hash of the first few pixels\n let hash = 0;\n for (let i = 0; i < 400; i += 4) {\n hash = (hash << 5) - hash + imageData[i];\n }\n\n // Edge typically has different text rendering than Chrome\n if (hash < 0) {\n // Just an example threshold, would need calibration\n detections.push({ name: \"Edge\", confidence: 50 }); // Increased confidence\n }\n }\n } catch (e) {\n // Canvas access might be restricted\n }\n}\n\n/**\n * Enhanced detection for Chrome browser\n */\nfunction detectChromeBrowser(\n detections: { name: string; confidence: number }[]\n): void {\n // Complex feature combination check specific to Chrome but not other Chromium browsers\n if (\n // Must have Chrome in user agent but not be Edge or Opera\n navigator.userAgent.indexOf(\"Chrome\") !== -1 &&\n navigator.userAgent.indexOf(\"Edg\") === -1 &&\n navigator.userAgent.indexOf(\"OPR\") === -1 &&\n // Must have chrome object with specific properties\n typeof (window as any).chrome !== \"undefined\" &&\n (window as any).chrome.runtime &&\n // Check for Chrome-exclusive features\n typeof (window as any).chrome.loadTimes === \"function\" &&\n typeof (window as any).chrome.csi === \"function\" &&\n // Ensure not Brave\n typeof (navigator as any).brave === \"undefined\"\n ) {\n detections.push({ name: \"Chrome\", confidence: 75 });\n }\n\n // Check for Chrome PDF viewer plugin (generally not present in other Chromium browsers)\n try {\n const hasPdfViewer = Array.from(navigator.plugins).some(\n (plugin) => plugin.name === \"Chrome PDF Viewer\"\n );\n\n if (\n hasPdfViewer &&\n navigator.userAgent.indexOf(\"Chrome\") !== -1 &&\n navigator.userAgent.indexOf(\"Edg\") === -1\n ) {\n detections.push({ name: \"Chrome\", confidence: 60 });\n }\n } catch (e) {\n // Plugin check failed\n }\n\n // Check Chrome version consistency in User Agent\n // This helps differentiate from browsers that modify the Chrome version string\n try {\n const chromeMatch = navigator.userAgent.match(/Chrome\\/([0-9.]+)/);\n if (chromeMatch) {\n const chromeVersion = chromeMatch[1];\n\n // If app version contains the Chrome version and doesn't have Edg\n if (\n navigator.appVersion.indexOf(chromeVersion) !== -1 &&\n navigator.userAgent.indexOf(\"Edg\") === -1 &&\n navigator.userAgent.indexOf(\"OPR\") === -1\n ) {\n detections.push({ name: \"Chrome\", confidence: 30 });\n }\n }\n } catch (e) {\n // Version check failed\n }\n}\n\n/**\n * Attempts to get the browser version\n */\nfunction getBrowserVersion(browserName: string): string {\n const userAgent = navigator.userAgent;\n let version = \"Unknown\";\n\n try {\n if (browserName === \"Chrome\") {\n const match = userAgent.match(/Chrome\\/([0-9.]+)/);\n if (match) {\n version = match[1];\n }\n } else if (browserName === \"Firefox\") {\n const match = userAgent.match(/Firefox\\/([0-9.]+)/);\n if (match) {\n version = match[1];\n }\n } else if (browserName === \"Safari\") {\n const match = userAgent.match(/Version\\/([0-9.]+)/);\n if (match) {\n version = match[1];\n }\n } else if (browserName === \"Edge\") {\n // Modern Edge (Chromium-based)\n const edgeMatch = userAgent.match(/Edg(?:e)?\\/([0-9.]+)/);\n if (edgeMatch) {\n version = edgeMatch[1];\n }\n } else if (browserName === \"Opera\") {\n const match = userAgent.match(/OPR\\/([0-9.]+)/);\n if (match) {\n version = match[1];\n }\n } else if (browserName === \"Brave\") {\n // First try to get version through Brave API if available\n if ((navigator as any).brave && (navigator as any).brave.version) {\n version = (navigator as any).brave.version;\n } else {\n // Otherwise extract from user agent like Chrome\n // Brave uses the same Chrome version string but with Brave/[version]\n const braveMatch = userAgent.match(/Brave\\/([0-9.]+)/);\n if (braveMatch) {\n version = braveMatch[1];\n } else {\n // Fall back to Chrome version\n const chromeMatch = userAgent.match(/Chrome\\/([0-9.]+)/);\n if (chromeMatch) {\n version = chromeMatch[1];\n }\n }\n\n // Try to access the Brave browser version via JavaScript API if available\n if (typeof (navigator as any).brave !== \"undefined\") {\n try {\n // Request brave version info\n (navigator as any).brave.isBrave().then((isBrave: boolean) => {\n if (isBrave) {\n // Remove console log\n }\n });\n } catch (e) {\n // API access failed\n }\n }\n }\n }\n } catch (e) {\n // Keep default 'Unknown' value\n }\n\n return version;\n}\ninterface BrowserResult {\n name: string;\n version: string;\n}\n\nexport function getBrowser(): BrowserResult {\n if (typeof navigator === \"undefined\") {\n return {\n name: \"unknown\",\n version: \"unknown\",\n };\n }\n const ua = navigator.userAgent;\n // Define some regular expressions to match different browsers and their versions\n const regexes = [\n // Edge\n /(?<name>Edge|Edg)\\/(?<version>\\d+(?:\\.\\d+)?)/,\n // Chrome, Chromium, Opera, Vivaldi, Brave, etc.\n /(?<name>(?:Chrome|Chromium|OPR|Opera|Vivaldi|Brave))\\/(?<version>\\d+(?:\\.\\d+)?)/,\n // Firefox, Waterfox, etc.\n /(?<name>(?:Firefox|Waterfox|Iceweasel|IceCat))\\/(?<version>\\d+(?:\\.\\d+)?)/,\n // Safari, Mobile Safari, etc.\n /(?<name>Safari)\\/(?<version>\\d+(?:\\.\\d+)?)/,\n // Internet Explorer, IE Mobile, etc.\n /(?<name>MSIE|Trident|IEMobile).+?(?<version>\\d+(?:\\.\\d+)?)/,\n // Other browsers that use the format \"BrowserName/version\"\n /(?<name>[A-Za-z]+)\\/(?<version>\\d+(?:\\.\\d+)?)/,\n // Samsung internet browser\n /(?<name>SamsungBrowser)\\/(?<version>\\d+(?:\\.\\d+)?)/,\n // Samsung browser (Tizen format)\n /(?<name>samsung).*Version\\/(?<version>\\d+(?:\\.\\d+)?)/i,\n ];\n\n // Define a map for browser name translations\n const browserNameMap: { [key: string]: string } = {\n edg: \"Edge\",\n opr: \"Opera\",\n samsung: \"SamsungBrowser\",\n };\n\n // Loop through the regexes and try to find a match\n for (const regex of regexes) {\n const match = ua.match(regex);\n if (match && match.groups) {\n // Translate the browser name if necessary\n const name =\n browserNameMap[match.groups.name.toLowerCase()] || match.groups.name;\n // Return the browser name and version\n return {\n name: name,\n version: match.groups.version,\n };\n }\n }\n\n // If no match is found, return unknown\n return {\n name: \"unknown\",\n version: \"unknown\",\n };\n}\n","// Generated ESM version of ua-parser-js\n// DO NOT EDIT THIS FILE!\n// Source: /src/main/ua-parser.js\n\n/////////////////////////////////////////////////////////////////////////////////\n/* UAParser.js v2.0.4\n Copyright © 2012-2025 Faisal Salman <f@faisalman.com>\n AGPLv3 License *//*\n Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.\n Supports browser & node.js environment. \n Demo : https://uaparser.dev\n Source : https://github.com/faisalman/ua-parser-js */\n/////////////////////////////////////////////////////////////////////////////////\n\n/* jshint esversion: 6 */ \n/* globals window */\n\n\n \n //////////////\n // Constants\n /////////////\n\n var LIBVERSION = '2.0.4',\n UA_MAX_LENGTH = 500,\n USER_AGENT = 'user-agent',\n EMPTY = '',\n UNKNOWN = '?',\n\n // typeof\n FUNC_TYPE = 'function',\n UNDEF_TYPE = 'undefined',\n OBJ_TYPE = 'object',\n STR_TYPE = 'string',\n\n // properties\n UA_BROWSER = 'browser',\n UA_CPU = 'cpu',\n UA_DEVICE = 'device',\n UA_ENGINE = 'engine',\n UA_OS = 'os',\n UA_RESULT = 'result',\n \n NAME = 'name',\n TYPE = 'type',\n VENDOR = 'vendor',\n VERSION = 'version',\n ARCHITECTURE= 'architecture',\n MAJOR = 'major',\n MODEL = 'model',\n\n // device types\n CONSOLE = 'console',\n MOBILE = 'mobile',\n TABLET = 'tablet',\n SMARTTV = 'smarttv',\n WEARABLE = 'wearable',\n XR = 'xr',\n EMBEDDED = 'embedded',\n\n // browser types\n INAPP = 'inapp',\n\n // client hints\n BRANDS = 'brands',\n FORMFACTORS = 'formFactors',\n FULLVERLIST = 'fullVersionList',\n PLATFORM = 'platform',\n PLATFORMVER = 'platformVersion',\n BITNESS = 'bitness',\n CH_HEADER = 'sec-ch-ua',\n CH_HEADER_FULL_VER_LIST = CH_HEADER + '-full-version-list',\n CH_HEADER_ARCH = CH_HEADER + '-arch',\n CH_HEADER_BITNESS = CH_HEADER + '-' + BITNESS,\n CH_HEADER_FORM_FACTORS = CH_HEADER + '-form-factors',\n CH_HEADER_MOBILE = CH_HEADER + '-' + MOBILE,\n CH_HEADER_MODEL = CH_HEADER + '-' + MODEL,\n CH_HEADER_PLATFORM = CH_HEADER + '-' + PLATFORM,\n CH_HEADER_PLATFORM_VER = CH_HEADER_PLATFORM + '-version',\n CH_ALL_VALUES = [BRANDS, FULLVERLIST, MOBILE, MODEL, PLATFORM, PLATFORMVER, ARCHITECTURE, FORMFACTORS, BITNESS],\n\n // device vendors\n AMAZON = 'Amazon',\n APPLE = 'Apple',\n ASUS = 'ASUS',\n BLACKBERRY = 'BlackBerry',\n GOOGLE = 'Google',\n HUAWEI = 'Huawei',\n LENOVO = 'Lenovo',\n HONOR = 'Honor',\n LG = 'LG',\n MICROSOFT = 'Microsoft',\n MOTOROLA = 'Motorola',\n NVIDIA = 'Nvidia',\n ONEPLUS = 'OnePlus',\n OPPO = 'OPPO',\n SAMSUNG = 'Samsung',\n SHARP = 'Sharp',\n SONY = 'Sony',\n XIAOMI = 'Xiaomi',\n ZEBRA = 'Zebra',\n\n // browsers\n CHROME = 'Chrome',\n CHROMIUM = 'Chromium',\n CHROMECAST = 'Chromecast',\n EDGE = 'Edge',\n FIREFOX = 'Firefox',\n OPERA = 'Opera',\n FACEBOOK = 'Facebook',\n SOGOU = 'Sogou',\n\n PREFIX_MOBILE = 'Mobile ',\n SUFFIX_BROWSER = ' Browser',\n\n // os\n WINDOWS = 'Windows';\n \n var isWindow = typeof window !== UNDEF_TYPE,\n NAVIGATOR = (isWindow && window.navigator) ? \n window.navigator : \n undefined,\n NAVIGATOR_UADATA = (NAVIGATOR && NAVIGATOR.userAgentData) ? \n NAVIGATOR.userAgentData : \n undefined;\n\n ///////////\n // Helper\n //////////\n\n var extend = function (defaultRgx, extensions) {\n var mergedRgx = {};\n var extraRgx = extensions;\n if (!isExtensions(extensions)) {\n extraRgx = {};\n for (var i in extensions) {\n for (var j in extensions[i]) {\n extraRgx[j] = extensions[i][j].concat(extraRgx[j] ? extraRgx[j] : []);\n }\n }\n }\n for (var k in defaultRgx) {\n mergedRgx[k] = extraRgx[k] && extraRgx[k].length % 2 === 0 ? extraRgx[k].concat(defaultRgx[k]) : defaultRgx[k];\n }\n return mergedRgx;\n },\n enumerize = function (arr) {\n var enums = {};\n for (var i=0; i<arr.length; i++) {\n enums[arr[i].toUpperCase()] = arr[i];\n }\n return enums;\n },\n has = function (str1, str2) {\n if (typeof str1 === OBJ_TYPE && str1.length > 0) {\n for (var i in str1) {\n if (lowerize(str2) == lowerize(str1[i])) return true;\n }\n return false;\n }\n return isString(str1) ? lowerize(str2) == lowerize(str1) : false;\n },\n isExtensions = function (obj, deep) {\n for (var prop in obj) {\n return /^(browser|cpu|device|engine|os)$/.test(prop) || (deep ? isExtensions(obj[prop]) : false);\n }\n },\n isString = function (val) {\n return typeof val === STR_TYPE;\n },\n itemListToArray = function (header) {\n if (!header) return undefined;\n var arr = [];\n var tokens = strip(/\\\\?\\\"/g, header).split(',');\n for (var i = 0; i < tokens.length; i++) {\n if (tokens[i].indexOf(';') > -1) {\n var token = trim(tokens[i]).split(';v=');\n arr[i] = { brand : token[0], version : token[1] };\n } else {\n arr[i] = trim(tokens[i]);\n }\n }\n return arr;\n },\n lowerize = function (str) {\n return isString(str) ? str.toLowerCase() : str;\n },\n majorize = function (version) {\n return isString(version) ? strip(/[^\\d\\.]/g, version).split('.')[0] : undefined;\n },\n setProps = function (arr) {\n for (var i in arr) {\n var propName = arr[i];\n if (typeof propName == OBJ_TYPE && propName.length == 2) {\n this[propName[0]] = propName[1];\n } else {\n this[propName] = undefined;\n }\n }\n return this;\n },\n strip = function (pattern, str) {\n return isString(str) ? str.replace(pattern, EMPTY) : str;\n },\n stripQuotes = function (str) {\n return strip(/\\\\?\\\"/g, str); \n },\n trim = function (str, len) {\n if (isString(str)) {\n str = strip(/^\\s\\s*/, str);\n return typeof len === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);\n }\n };\n\n ///////////////\n // Map helper\n //////////////\n\n var rgxMapper = function (ua, arrays) {\n\n if(!ua || !arrays) return;\n\n var i = 0, j, k, p, q, matches, match;\n\n // loop through all regexes maps\n while (i < arrays.length && !matches) {\n\n var regex = arrays[i], // even sequence (0,2,4,..)\n props = arrays[i + 1]; // odd sequence (1,3,5,..)\n j = k = 0;\n\n // try matching uastring with regexes\n while (j < regex.length && !matches) {\n\n if (!regex[j]) { break; }\n matches = regex[j++].exec(ua);\n\n if (!!matches) {\n for (p = 0; p < props.length; p++) {\n match = matches[++k];\n q = props[p];\n // check if given property is actually array\n if (typeof q === OBJ_TYPE && q.length > 0) {\n if (q.length === 2) {\n if (typeof q[1] == FUNC_TYPE) {\n // assign modified match\n this[q[0]] = q[1].call(this, match);\n } else {\n // assign given value, ignore regex match\n this[q[0]] = q[1];\n }\n } else if (q.length >= 3) {\n // Check whether q[1] FUNCTION or REGEX\n if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {\n if (q.length > 3) {\n this[q[0]] = match ? q[1].apply(this, q.slice(2)) : undefined;\n } else {\n // call function (usually string mapper)\n this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;\n }\n } else {\n if (q.length == 3) {\n // sanitize match using given regex\n this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;\n } else if (q.length == 4) {\n this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;\n } else if (q.length > 4) {\n this[q[0]] = match ? q[3].apply(this, [match.replace(q[1], q[2])].concat(q.slice(4))) : undefined;\n }\n }\n }\n } else {\n this[q] = match ? match : undefined;\n }\n }\n }\n }\n i += 2;\n }\n },\n\n strMapper = function (str, map) {\n\n for (var i in map) {\n // check if current value is array\n if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {\n for (var j = 0; j < map[i].length; j++) {\n if (has(map[i][j], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n } else if (has(map[i], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n return map.hasOwnProperty('*') ? map['*'] : str;\n };\n\n ///////////////\n // String map\n //////////////\n\n var windowsVersionMap = {\n 'ME' : '4.90',\n 'NT 3.51': '3.51',\n 'NT 4.0': '4.0',\n '2000' : ['5.0', '5.01'],\n 'XP' : ['5.1', '5.2'],\n 'Vista' : '6.0',\n '7' : '6.1',\n '8' : '6.2',\n '8.1' : '6.3',\n '10' : ['6.4', '10.0'],\n 'NT' : ''\n },\n \n formFactorsMap = {\n 'embedded' : 'Automotive',\n 'mobile' : 'Mobile',\n 'tablet' : ['Tablet', 'EInk'],\n 'smarttv' : 'TV',\n 'wearable' : 'Watch',\n 'xr' : ['VR', 'XR'],\n '?' : ['Desktop', 'Unknown'],\n '*' : undefined\n },\n\n browserHintsMap = {\n 'Chrome' : 'Google Chrome',\n 'Edge' : 'Microsoft Edge',\n 'Edge WebView2' : 'Microsoft Edge WebView2',\n 'Chrome WebView': 'Android WebView',\n 'Chrome Headless':'HeadlessChrome',\n 'Huawei Browser': 'HuaweiBrowser',\n 'MIUI Browser' : 'Miui Browser',\n 'Opera Mobi' : 'OperaMobile',\n 'Yandex' : 'YaBrowser'\n };\n\n //////////////\n // Regex map\n /////////////\n\n var defaultRegexes = {\n\n browser : [[\n\n // Most common regardless engine\n /\\b(?:crmo|crios)\\/([\\w\\.]+)/i // Chrome for Android/iOS\n ], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [\n /webview.+edge\\/([\\w\\.]+)/i // Microsoft Edge\n ], [VERSION, [NAME, EDGE+' WebView']], [\n /edg(?:e|ios|a)?\\/([\\w\\.]+)/i \n ], [VERSION, [NAME, 'Edge']], [\n\n // Presto based\n /(opera mini)\\/([-\\w\\.]+)/i, // Opera Mini\n /(opera [mobiletab]{3,6})\\b.+version\\/([-\\w\\.]+)/i, // Opera Mobi/Tablet\n /(opera)(?:.+version\\/|[\\/ ]+)([\\w\\.]+)/i // Opera\n ], [NAME, VERSION], [\n /opios[\\/ ]+([\\w\\.]+)/i // Opera mini on iphone >= 8.0\n ], [VERSION, [NAME, OPERA+' Mini']], [\n /\\bop(?:rg)?x\\/([\\w\\.]+)/i // Opera GX\n ], [VERSION, [NAME, OPERA+' GX']], [\n /\\bopr\\/([\\w\\.]+)/i // Opera Webkit\n ], [VERSION, [NAME, OPERA]], [\n\n // Mixed\n /\\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\\/ ]?([\\w\\.]+)/i // Baidu\n ], [VERSION, [NAME, 'Baidu']], [\n /\\b(?:mxbrowser|mxios|myie2)\\/?([-\\w\\.]*)\\b/i // Maxthon\n ], [VERSION, [NAME, 'Maxthon']], [\n /(kindle)\\/([\\w\\.]+)/i, // Kindle\n /(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\\/ ]?([\\w\\.]*)/i, \n // Lunascape/Maxthon/Netfront/Jasmine/Blazer/Sleipnir\n // Trident based\n /(avant|iemobile|slim(?:browser|boat|jet))[\\/ ]?([\\d\\.]*)/i, // Avant/IEMobile/SlimBrowser/SlimBoat/Slimjet\n /(?:ms|\\()(ie) ([\\w\\.]+)/i, // Internet Explorer\n\n // Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon/LG Browser/Otter/qutebrowser/Dooble\n /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:lg |qute)browser)\\/([-\\w\\.]+)/i,\n // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon\n /(heytap|ovi|115|surf)browser\\/([\\d\\.]+)/i, // HeyTap/Ovi/115/Surf\n /(ecosia|weibo)(?:__| \\w+@)([\\d\\.]+)/i // Ecosia/Weibo\n ], [NAME, VERSION], [\n /quark(?:pc)?\\/([-\\w\\.]+)/i // Quark\n ], [VERSION, [NAME, 'Quark']], [\n /\\bddg\\/([\\w\\.]+)/i // DuckDuckGo\n ], [VERSION, [NAME, 'DuckDuckGo']], [\n /(?:\\buc? ?browser|(?:juc.+)ucweb)[\\/ ]?([\\w\\.]+)/i // UCBrowser\n ], [VERSION, [NAME, 'UCBrowser']], [\n /microm.+\\bqbcore\\/([\\w\\.]+)/i, // WeChat Desktop for Windows Built-in Browser\n /\\bqbcore\\/([\\w\\.]+).+microm/i,\n /micromessenger\\/([\\w\\.]+)/i // WeChat\n ], [VERSION, [NAME, 'WeChat']], [\n /konqueror\\/([\\w\\.]+)/i // Konqueror\n ], [VERSION, [NAME, 'Konqueror']], [\n /trident.+rv[: ]([\\w\\.]{1,9})\\b.+like gecko/i // IE11\n ], [VERSION, [NAME, 'IE']], [\n /ya(?:search)?browser\\/([\\w\\.]+)/i // Yandex\n ], [VERSION, [NAME, 'Yandex']], [\n /slbrowser\\/([\\w\\.]+)/i // Smart Lenovo Browser\n ], [VERSION, [NAME, 'Smart ' + LENOVO + SUFFIX_BROWSER]], [\n /(avast|avg)\\/([\\w\\.]+)/i // Avast/AVG Secure Browser\n ], [[NAME, /(.+)/, '$1 Secure' + SUFFIX_BROWSER], VERSION], [\n /\\bfocus\\/([\\w\\.]+)/i // Firefox Focus\n ], [VERSION, [NAME, FIREFOX+' Focus']], [\n /\\bopt\\/([\\w\\.]+)/i // Opera Touch\n ], [VERSION, [NAME, OPERA+' Touch']], [\n /coc_coc\\w+\\/([\\w\\.]+)/i // Coc Coc Browser\n ], [VERSION, [NAME, 'Coc Coc']], [\n /dolfin\\/([\\w\\.]+)/i // Dolphin\n ], [VERSION, [NAME, 'Dolphin']], [\n /coast\\/([\\w\\.]+)/i // Opera Coast\n ], [VERSION, [NAME, OPERA+' Coast']], [\n /miuibrowser\\/([\\w\\.]+)/i // MIUI Browser\n ], [VERSION, [NAME, 'MIUI' + SUFFIX_BROWSER]], [\n /fxios\\/([\\w\\.-]+)/i // Firefox for iOS\n ], [VERSION, [NAME, PREFIX_MOBILE + FIREFOX]], [\n /\\bqihoobrowser\\/?([\\w\\.]*)/i // 360\n ], [VERSION, [NAME, '360']], [\n /\\b(qq)\\/([\\w\\.]+)/i // QQ\n ], [[NAME, /(.+)/, '$1Browser'], VERSION], [\n /(oculus|sailfish|huawei|vivo|pico)browser\\/([\\w\\.]+)/i\n ], [[NAME, /(.+)/, '$1' + SUFFIX_BROWSER], VERSION], [ // Oculus/Sailfish/HuaweiBrowser/VivoBrowser/PicoBrowser\n /samsungbrowser\\/([\\w\\.]+)/i // Samsung Internet\n ], [VERSION, [NAME, SAMSUNG + ' Internet']], [\n /metasr[\\/ ]?([\\d\\.]+)/i // Sogou Explorer\n ], [VERSION, [NAME, SOGOU + ' Explorer']], [\n /(sogou)mo\\w+\\/([\\d\\.]+)/i // Sogou Mobile\n ], [[NAME, SOGOU + ' Mobile'], VERSION], [\n /(electron)\\/([\\w\\.]+) safari/i, // Electron-based App\n /(tesla)(?: qtcarbrowser|\\/(20\\d\\d\\.[-\\w\\.]+))/i, // Tesla\n /m?(qqbrowser|2345(?=browser|chrome|explorer))\\w*[\\/ ]?v?([\\w\\.]+)/i // QQ/2345\n ], [NAME, VERSION], [\n /(lbbrowser|rekonq)/i // LieBao Browser/Rekonq\n ], [NAME], [\n /ome\\/([\\w\\.]+) \\w* ?(iron) saf/i, // Iron\n /ome\\/([\\w\\.]+).+qihu (360)[es]e/i // 360\n ], [VERSION, NAME], [\n\n // WebView\n /((?:fban\\/fbios|fb_iab\\/fb4a)(?!.+fbav)|;fbav\\/([\\w\\.]+);)/i // Facebook App for iOS & Android\n ], [[NAME, FACEBOOK], VERSION, [TYPE, INAPP]], [\n /(kakao(?:talk|story))[\\/ ]([\\w\\.]+)/i, // Kakao App\n /(naver)\\(.*?(\\d+\\.[\\w\\.]+).*\\)/i, // Naver InApp\n /(daum)apps[\\/ ]([\\w\\.]+)/i, // Daum App\n /safari (line)\\/([\\w\\.]+)/i, // Line App for iOS\n /\\b(line)\\/([\\w\\.]+)\\/iab/i, // Line App for Android\n /(alipay)client\\/([\\w\\.]+)/i, // Alipay\n /(twitter)(?:and| f.+e\\/([\\w\\.]+))/i, // Twitter\n /(instagram|snapchat|klarna)[\\/ ]([-\\w\\.]+)/i // Instagram/Snapchat/Klarna\n ], [NAME, VERSION, [TYPE, INAPP]], [\n /\\bgsa\\/([\\w\\.]+) .*safari\\//i // Google Search Appliance on iOS\n ], [VERSION, [NAME, 'GSA'], [TYPE, INAPP]], [\n /musical_ly(?:.+app_?version\\/|_)([\\w\\.]+)/i // TikTok\n ], [VERSION, [NAME, 'TikTok'], [TYPE, INAPP]], [\n /\\[(linkedin)app\\]/i // LinkedIn App for iOS & Android\n ], [NAME, [TYPE, INAPP]], [\n\n /(chromium)[\\/ ]([-\\w\\.]+)/i // Chromium\n ], [NAME, VERSION], [\n\n /headlesschrome(?:\\/([\\w\\.]+)| )/i // Chrome Headless\n ], [VERSION, [NAME, CHROME+' Headless']], [\n\n /wv\\).+chrome\\/([\\w\\.]+).+edgw\\//i // Edge WebView2\n ], [VERSION, [NAME, EDGE+' WebView2']], [\n\n / wv\\).+(chrome)\\/([\\w\\.]+)/i // Chrome WebView\n ], [[NAME, CHROME+' WebView'], VERSION], [\n\n /droid.+ version\\/([\\w\\.]+)\\b.+(?:mobile safari|safari)/i // Android Browser\n ], [VERSION, [NAME, 'Android' + SUFFIX_BROWSER]], [\n\n /chrome\\/([\\w\\.]+) mobile/i // Chrome Mobile\n ], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [\n\n /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\\/v?([\\w\\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia\n ], [NAME, VERSION], [\n\n /version\\/([\\w\\.\\,]+) .*mobile(?:\\/\\w+ | ?)safari/i // Safari Mobile\n ], [VERSION, [NAME, PREFIX_MOBILE + 'Safari']], [\n /iphone .*mobile(?:\\/\\w+ | ?)safari/i\n ], [[NAME, PREFIX_MOBILE + 'Safari']], [\n /version\\/([\\w\\.\\,]+) .*(safari)/i // Safari\n ], [VERSION, NAME], [\n /webkit.+?(mobile ?safari|safari)(\\/[\\w\\.]+)/i // Safari < 3.0\n ], [NAME, [VERSION, '1']], [\n\n /(webkit|khtml)\\/([\\w\\.]+)/i\n ], [NAME, VERSION], [\n\n // Gecko based\n /(?:mobile|tablet);.*(firefox)\\/([\\w\\.-]+)/i // Firefox Mobile\n ], [[NAME, PREFIX_MOBILE + FIREFOX], VERSION], [\n /(navigator|netscape\\d?)\\/([-\\w\\.]+)/i // Netscape\n ], [[NAME, 'Netscape'], VERSION], [\n /(wolvic|librewolf)\\/([\\w\\.]+)/i // Wolvic/LibreWolf\n ], [NAME, VERSION], [\n /mobile vr; rv:([\\w\\.]+)\\).+firefox/i // Firefox Reality\n ], [VERSION, [NAME, FIREFOX+' Reality']], [\n /ekiohf.+(flow)\\/([\\w\\.]+)/i, // Flow\n /(swiftfox)/i, // Swiftfox\n /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\\/ ]?([\\w\\.\\+]+)/i,\n // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror\n /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\\/([-\\w\\.]+)$/i,\n // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix\n /(firefox)\\/([\\w\\.]+)/i, // Other Firefox-based\n /(mozilla)\\/([\\w\\.]+) .+rv\\:.+gecko\\/\\d+/i, // Mozilla\n\n // Other\n /(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\\. ]?browser)[-\\/ ]?v?([\\w\\.]+)/i,\n // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser/Ladybird\n /\\b(links) \\(([\\w\\.]+)/i // Links\n ], [NAME, [VERSION, /_/g, '.']], [\n \n /(cobalt)\\/([\\w\\.]+)/i // Cobalt\n ], [NAME, [VERSION, /[^\\d\\.]+./, EMPTY]]\n ],\n\n cpu : [[\n\n /\\b((amd|x|x86[-_]?|wow|win)64)\\b/i // AMD64 (x64)\n ], [[ARCHITECTURE, 'amd64']], [\n\n /(ia32(?=;))/i, // IA32 (quicktime)\n /\\b((i[346]|x)86)(pc)?\\b/i // IA32 (x86)\n ], [[ARCHITECTURE, 'ia32']], [\n\n /\\b(aarch64|arm(v?[89]e?l?|_?64))\\b/i // ARM64\n ], [[ARCHITECTURE, 'arm64']], [\n\n /\\b(arm(v[67])?ht?n?[fl]p?)\\b/i // ARMHF\n ], [[ARCHITECTURE, 'armhf']], [\n\n // PocketPC mistakenly identified as PowerPC\n /( (ce|mobile); ppc;|\\/[\\w\\.]+arm\\b)/i\n ], [[ARCHITECTURE, 'arm']], [\n\n /((ppc|powerpc)(64)?)( mac|;|\\))/i // PowerPC\n ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [\n\n / sun4\\w[;\\)]/i // SPARC\n ], [[ARCHITECTURE, 'sparc']], [\n\n /\\b(avr32|ia64(?=;)|68k(?=\\))|\\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\\b|pa-risc)/i\n // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC\n ], [[ARCHITECTURE, lowerize]]\n ],\n\n device : [[\n\n //////////////////////////\n // MOBILES & TABLETS\n /////////////////////////\n\n // Samsung\n /\\b(sch-i[89]0\\d|shw-m380s|sm-[ptx]\\w{2,4}|gt-[pn]\\d{2,4}|sgh-t8[56]9|nexus 10)/i\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [\n /\\b((?:s[cgp]h|gt|sm)-(?![lr])\\w+|sc[g-]?[\\d]+a?|galaxy nexus)/i,\n /samsung[- ]((?!sm-[lr]|browser)[-\\w]+)/i,\n /sec-(sgh\\w+)/i\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [\n\n // Apple\n /(?:\\/|\\()(ip(?:hone|od)[\\w, ]*)(?:\\/|;)/i // iPod/iPhone\n ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [\n /\\((ipad);[-\\w\\),; ]+apple/i, // iPad\n /applecoremedia\\/[\\w\\.]+ \\((ipad)/i,\n /\\b(ipad)\\d\\d?,\\d\\d?[;\\]].+ios/i\n ], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [\n /(macintosh);/i\n ], [MODEL, [VENDOR, APPLE]], [\n\n // Sharp\n /\\b(sh-?[altvz]?\\d\\d[a-ekm]?)/i\n ], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [\n\n // Honor\n /\\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\\)|;)/i\n ], [MODEL, [VENDOR, HONOR], [TYPE, TABLET]], [\n /honor([-\\w ]+)[;\\)]/i\n ], [MODEL, [VENDOR, HONOR], [TYPE, MOBILE]], [\n\n // Huawei\n /\\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\\w\\. ]*(?= bui|\\)))\\b(?!.+d\\/s)/i\n ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [\n /(?:huawei)([-\\w ]+)[;\\)]/i,\n /\\b(nexus 6p|\\w{2,4}e?-[atu]?[ln][\\dx][012359c][adn]?)\\b(?!.+d\\/s)/i\n ], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [\n\n // Xiaomi\n /oid[^\\)]+; (2[\\dbc]{4}(182|283|rp\\w{2})[cgl]|m2105k81a?c)(?: bui|\\))/i,\n /\\b((?:red)?mi[-_ ]?pad[\\w- ]*)(?: bui|\\))/i // Mi Pad tablets\n ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [\n\n /\\b(poco[\\w ]+|m2\\d{3}j\\d\\d[a-z]{2})(?: bui|\\))/i, // Xiaomi POCO\n /\\b; (\\w+) build\\/hm\\1/i, // Xiaomi Hongmi 'numeric' models\n /\\b(hm[-_ ]?note?[_ ]?(?:\\d\\w)?) bui/i, // Xiaomi Hongmi\n /\\b(redmi[\\-_ ]?(?:note|k)?[\\w_ ]+)(?: bui|\\))/i, // Xiaomi Redmi\n /oid[^\\)]+; (m?[12][0-389][01]\\w{3,6}[c-y])( bui|; wv|\\))/i, // Xiaomi Redmi 'numeric' models\n /\\b(mi[-_ ]?(?:a\\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\\d?\\w?)[_ ]?(?:plus|se|lite|pro)?)(?: bui|\\))/i, // Xiaomi Mi\n / ([\\w ]+) miui\\/v?\\d/i\n ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [\n\n // OnePlus\n /droid.+; (cph2[3-6]\\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\\d|p[g-k]\\w[1m]10)\\b/i,\n /(?:one)?(?:plus)? (a\\d0\\d\\d)(?: b|\\))/i\n ], [MODEL, [VENDOR, ONEPLUS], [TYPE, MOBILE]], [\n\n // OPPO\n /; (\\w+) bui.+ oppo/i,\n /\\b(cph[12]\\d{3}|p(?:af|c[al]|d\\w|e[ar])[mt]\\d0|x9007|a101op)\\b/i\n ], [MODEL, [VENDOR, OPPO], [TYPE, MOBILE]], [\n /\\b(opd2(\\d{3}a?))(?: bui|\\))/i\n ], [MODEL, [VENDOR, strMapper, { 'OnePlus' : ['203', '304', '403', '404', '413', '415'], '*' : OPPO }], [TYPE, TABLET]], [\n\n // BLU\n /(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\\w\\+ ]*)(?: bui|\\))/i // Vivo series\n ], [MODEL, [VENDOR, 'BLU'], [TYPE, MOBILE]], [ \n\n // Vivo\n /; vivo (\\w+)(?: bui|\\))/i,\n /\\b(v[12]\\d{3}\\w?[at])(?: bui|;)/i\n ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [\n\n // Realme\n /\\b(rmx[1-3]\\d{3})(?: bui|;|\\))/i\n ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [\n\n // Lenovo\n /(ideatab[-\\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\\d{3,4}(?:f[cu]|xu|[av])|yt\\d?-[jx]?\\d+[lfmx])( bui|;|\\)|\\/)/i,\n /lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\\w- ]+?)|tb[\\w-]{6,7})( bui|;|\\)|\\/)/i\n ], [MODEL, [VENDOR, LENOVO], [TYPE, TABLET]], [ \n /lenovo[-_ ]?([-\\w ]+?)(?: bui|\\)|\\/)/i\n ], [MODEL, [VENDOR, LENOVO], [TYPE, MOBILE]], [\n\n // Motorola\n /\\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\\b[\\w ]+build\\//i,\n /\\bmot(?:orola)?[- ]([\\w\\s]+)(\\)| bui)/i,\n /((?:moto(?! 360)[-\\w\\(\\) ]+|xt\\d{3,4}[cgkosw\\+]?[-\\d]*|nexus 6)(?= bui|\\)))/i\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]], [\n /\\b(mz60\\d|xoom[2 ]{0,2}) build\\//i\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [\n\n // LG\n /((?=lg)?[vl]k\\-?\\d{3}) bui| 3\\.[-\\w; ]{10}lg?-([06cv9]{3,4})/i\n ], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [\n /(lm(?:-?f100[nv]?|-[\\w\\.]+)(?= bui|\\))|nexus [45])/i,\n /\\blg[-e;\\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\\w+)/i,\n /\\blg-?([\\d\\w]+) bui/i\n ], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [\n\n // Nokia\n /(nokia) (t[12][01])/i\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n /(?:maemo|nokia).*(n900|lumia \\d+|rm-\\d+)/i,\n /nokia[-_ ]?(([-\\w\\. ]*))/i\n ], [[MODEL, /_/g, ' '], [TYPE, MOBILE], [VENDOR, 'Nokia']], [\n\n // Google\n /(pixel (c|tablet))\\b/i // Google Pixel C/Tablet\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [\n // Google Pixel\n /droid.+;(?: google)? (g(01[13]a|020[aem]|025[jn]|1b60|1f8f|2ybb|4s1m|576d|5nz6|8hhn|8vou|a02099|c15s|d1yq|e2ae|ec77|gh2x|kv4x|p4bc|pj41|r83y|tt9q|ur25|wvk6)|pixel[\\d ]*a?( pro)?( xl)?( fold)?( \\(5g\\))?)( bui|\\))/i\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [\n /(google) (pixelbook( go)?)/i\n ], [VENDOR, MODEL], [\n\n // Sony\n /droid.+; (a?\\d[0-2]{2}so|[c-g]\\d{4}|so[-gl]\\w+|xq-\\w\\w\\d\\d)(?= bui|\\).+chrome\\/(?![1-6]{0,1}\\d\\.))/i\n ], [MODEL, [VENDOR, SONY], [TYPE, MOBILE]], [\n /sony tablet [ps]/i,\n /\\b(?:sony)?sgp\\w+(?: bui|\\))/i\n ], [[MODEL, 'Xperia Tablet'], [VENDOR, SONY], [TYPE, TABLET]], [\n\n // Amazon\n /(alexa)webm/i,\n /(kf[a-z]{2}wi|aeo(?!bc)\\w\\w)( bui|\\))/i, // Kindle Fire without Silk / Echo Show\n /(kf[a-z]+)( bui|\\)).+silk\\//i // Kindle Fire HD\n ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [\n /((?:sd|kf)[0349hijorstuw]+)( bui|\\)).+silk\\//i // Fire Phone\n ], [[MODEL, /(.+)/g, 'Fire Phone $1'], [VENDOR, AMAZON], [TYPE, MOBILE]], [\n\n // BlackBerry\n /(playbook);[-\\w\\),; ]+(rim)/i // BlackBerry PlayBook\n ], [MODEL, VENDOR, [TYPE, TABLET]], [\n /\\b((?:bb[a-f]|st[hv])100-\\d)/i,\n /\\(bb10; (\\w+)/i // BlackBerry 10\n ], [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]], [\n\n // Asus\n /(?:\\b|asus_)(transfo[prime ]{4,10} \\w+|eeepc|slider \\w+|nexus 7|padfone|p00[cj])/i\n ], [MODEL, [VENDOR, ASUS], [TYPE, TABLET]], [\n / (z[bes]6[027][012][km][ls]|zenfone \\d\\w?)\\b/i\n ], [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]], [\n\n // HTC\n /(nexus 9)/i // HTC Nexus 9\n ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [\n /(htc)[-;_ ]{1,2}([\\w ]+(?=\\)| bui)|\\w+)/i, // HTC\n\n // ZTE\n /(zte)[- ]([\\w ]+?)(?: bui|\\/|\\))/i,\n /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\\.))|sony(?!-bra))[-_ ]?([-\\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony\n ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [\n\n // TCL\n /tcl (xess p17aa)/i,\n /droid [\\w\\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\\w(\\w|\\w\\w))?(\\)| bui)/i\n ], [MODEL, [VENDOR, 'TCL'], [TYPE, TABLET]], [\n /droid [\\w\\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\\w(\\w|\\w\\w))?(\\)| bui)/i\n ], [MODEL, [VENDOR, 'TCL'], [TYPE, MOBILE]], [\n\n // itel\n /(itel) ((\\w+))/i\n ], [[VENDOR, lowerize], MODEL, [TYPE, strMapper, { 'tablet' : ['p10001l', 'w7001'], '*' : 'mobile' }]], [\n\n // Acer\n /droid.+; ([ab][1-7]-?[0178a]\\d\\d?)/i\n ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [\n\n // Meizu\n /droid.+; (m[1-5] note) bui/i,\n /\\bmz-([-\\w]{2,})/i\n ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [\n \n // Ulefone\n /; ((?:power )?armor(?:[\\w ]{0,8}))(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Ulefone'], [TYPE, MOBILE]], [\n\n // Energizer\n /; (energy ?\\w+)(?: bui|\\))/i,\n /; energizer ([\\w ]+)(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Energizer'], [TYPE, MOBILE]], [\n\n // Cat\n /; cat (b35);/i,\n /; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Cat'], [TYPE, MOBILE]], [\n\n // Smartfren\n /((?:new )?andromax[\\w- ]+)(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Smartfren'], [TYPE, MOBILE]], [\n\n // Nothing\n /droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i\n ], [MODEL, [VENDOR, 'Nothing'], [TYPE, MOBILE]], [\n\n // Archos\n /; (x67 5g|tikeasy \\w+|ac[1789]\\d\\w+)( b|\\))/i,\n /archos ?(5|gamepad2?|([\\w ]*[t1789]|hello) ?\\d+[\\w ]*)( b|\\))/i\n ], [MODEL, [VENDOR, 'Archos'], [TYPE, TABLET]], [\n /archos ([\\w ]+)( b|\\))/i,\n /; (ac[3-6]\\d\\w{2,8})( b|\\))/i \n ], [MODEL, [VENDOR, 'Archos'], [TYPE, MOBILE]], [\n\n // HMD\n /; (n159v)/i\n ], [MODEL, [VENDOR, 'HMD'], [TYPE, MOBILE]], [\n\n // MIXED\n /(imo) (tab \\w+)/i, // IMO\n /(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i // Infinix XPad / Tecno\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n /(blackberry|benq|palm(?=\\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\\w]*)/i,\n // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Tecno/Micromax/Advan\n /; (blu|hmd|imo|infinix|lava|oneplus|tcl)[_ ]([\\w\\+ ]+?)(?: bui|\\)|; r)/i, // BLU/HMD/IMO/Infinix/Lava/OnePlus/TCL\n /(hp) ([\\w ]+\\w)/i, // HP iPAQ\n /(microsoft); (lumia[\\w ]+)/i, // Microsoft Lumia\n /(oppo) ?([\\w ]+) bui/i // OPPO\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n\n /(kobo)\\s(ereader|touch)/i, // Kobo\n /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad\n /(kindle)\\/([\\w\\.]+)/i // Kindle\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n /(surface duo)/i // Surface Duo\n ], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [\n /droid [\\d\\.]+; (fp\\du?)(?: b|\\))/i // Fairphone\n ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [\n /((?:tegranote|shield t(?!.+d tv))[\\w- ]*?)(?: b|\\))/i // Nvidia Tablets\n ], [MODEL, [VENDOR, NVIDIA], [TYPE, TABLET]], [\n /(sprint) (\\w+)/i // Sprint Phones\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n /(kin\\.[onetw]{3})/i // Microsoft Kin\n ], [[MODEL, /\\./g, ' '], [VENDOR, MICROSOFT], [TYPE, MOBILE]], [\n /droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\\)/i // Zebra\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]], [\n /droid.+; (ec30|ps20|tc[2-8]\\d[kx])\\)/i\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [\n\n ///////////////////\n // SMARTTVS\n ///////////////////\n\n /smart-tv.+(samsung)/i // Samsung\n ], [VENDOR, [TYPE, SMARTTV]], [\n /hbbtv.+maple;(\\d+)/i\n ], [[MODEL, /^/, 'SmartTV'], [VENDOR, SAMSUNG], [TYPE, SMARTTV]], [\n /(vizio)(?: |.+model\\/)(\\w+-\\w+)/i, // Vizio\n /tcast.+(lg)e?. ([-\\w]+)/i // LG SmartTV\n ], [VENDOR, MODEL, [TYPE, SMARTTV]], [\n /(nux; netcast.+smarttv|lg (netcast\\.tv-201\\d|android tv))/i\n ], [[VENDOR, LG], [TYPE, SMARTTV]], [\n /(apple) ?tv/i // Apple TV\n ], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [\n /crkey.*devicetype\\/chromecast/i // Google Chromecast Third Generation\n ], [[MODEL, CHROMECAST+' Third Generation'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /crkey.*devicetype\\/([^/]*)/i // Google Chromecast with specific device type\n ], [[MODEL, /^/, 'Chromecast '], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /fuchsia.*crkey/i // Google Chromecast Nest Hub\n ], [[MODEL, CHROMECAST+' Nest Hub'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /crkey/i // Google Chromecast, Linux-based or unknown\n ], [[MODEL, CHROMECAST], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /(portaltv)/i // Facebook Portal TV\n ], [MODEL, [VENDOR, FACEBOOK], [TYPE, SMARTTV]], [\n /droid.+aft(\\w+)( bui|\\))/i // Fire TV\n ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [\n /(shield \\w+ tv)/i // Nvidia Shield TV\n ], [MODEL, [VENDOR, NVIDIA], [TYPE, SMARTTV]], [\n /\\(dtv[\\);].+(aquos)/i,\n /(aquos-tv[\\w ]+)\\)/i // Sharp\n ], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],[\n /(bravia[\\w ]+)( bui|\\))/i // Sony\n ], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [\n /(mi(tv|box)-?\\w+) bui/i // Xiaomi\n ], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [\n /Hbbtv.*(technisat) (.*);/i // TechniSAT\n ], [VENDOR, MODEL, [TYPE, SMARTTV]], [\n /\\b(roku)[\\dx]*[\\)\\/]((?:dvp-)?[\\d\\.]*)/i, // Roku\n /hbbtv\\/\\d+\\.\\d+\\.\\d+ +\\([\\w\\+ ]*; *([\\w\\d][^;]*);([^;]*)/i // HbbTV devices\n ], [[VENDOR, /.+\\/(\\w+)/, '$1', strMapper, {'LG':'lge'}], [MODEL, trim], [TYPE, SMARTTV]], [\n // SmartTV from Unidentified Vendors\n /droid.+; ([\\w- ]+) (?:android tv|smart[- ]?tv)/i\n ], [MODEL, [TYPE, SMARTTV]], [\n /\\b(android tv|smart[- ]?tv|opera tv|tv; rv:|large screen[\\w ]+safari)\\b/i\n ], [[TYPE, SMARTTV]], [\n\n ///////////////////\n // CONSOLES\n ///////////////////\n\n /(playstation \\w+)/i // Playstation\n ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [\n /\\b(xbox(?: one)?(?!; xbox))[\\); ]/i // Microsoft Xbox\n ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [\n /(ouya)/i, // Ouya\n /(nintendo) (\\w+)/i, // Nintendo\n /(retroid) (pocket ([^\\)]+))/i // Retroid Pocket\n ], [VENDOR, MODEL, [TYPE, CONSOLE]], [\n /droid.+; (shield)( bui|\\))/i // Nvidia Portable\n ], [MODEL, [VENDOR, NVIDIA], [TYPE, CONSOLE]], [\n\n ///////////////////\n // WEARABLES\n ///////////////////\n\n /\\b(sm-[lr]\\d\\d[0156][fnuw]?s?|gear live)\\b/i // Samsung Galaxy Watch\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, WEARABLE]], [\n /((pebble))app/i, // Pebble\n /(asus|google|lg|oppo) ((pixel |zen)?watch[\\w ]*)( bui|\\))/i // Asus ZenWatch / LG Watch / Pixel Watch\n ], [VENDOR, MODEL, [TYPE, WEARABLE]], [\n /(ow(?:19|20)?we?[1-3]{1,3})/i // Oppo Watch\n ], [MODEL, [VENDOR, OPPO], [TYPE, WEARABLE]], [\n /(watch)(?: ?os[,\\/]|\\d,\\d\\/)[\\d\\.]+/i // Apple Watch\n ], [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]], [\n /(opwwe\\d{3})/i // OnePlus Watch\n ], [MODEL, [VENDOR, ONEPLUS], [TYPE, WEARABLE]], [\n /(moto 360)/i // Motorola 360\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, WEARABLE]], [\n /(smartwatch 3)/i // Sony SmartWatch\n ], [MODEL, [VENDOR, SONY], [TYPE, WEARABLE]], [\n /(g watch r)/i // LG G Watch R\n ], [MODEL, [VENDOR, LG], [TYPE, WEARABLE]], [\n /droid.+; (wt63?0{2,3})\\)/i\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [\n\n ///////////////////\n // XR\n ///////////////////\n\n /droid.+; (glass) \\d/i // Google Glass\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, XR]], [\n /(pico) (4|neo3(?: link|pro)?)/i // Pico\n ], [VENDOR, MODEL, [TYPE, XR]], [\n /(quest( \\d| pro)?s?).+vr/i // Meta Quest\n ], [MODEL, [VENDOR, FACEBOOK], [TYPE, XR]], [\n /mobile vr; rv.+firefox/i // Unidentifiable VR device using Firefox Reality / Wolvic\n ], [[TYPE, XR]], [\n\n ///////////////////\n // EMBEDDED\n ///////////////////\n\n /(tesla)(?: qtcarbrowser|\\/[-\\w\\.]+)/i // Tesla\n ], [VENDOR, [TYPE, EMBEDDED]], [\n /(aeobc)\\b/i // Echo Dot\n ], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [\n /(homepod).+mac os/i // Apple HomePod\n ], [MODEL, [VENDOR, APPLE], [TYPE, EMBEDDED]], [\n /windows iot/i // Unidentifiable embedded device using Windows IoT\n ], [[TYPE, EMBEDDED]], [\n\n ////////////////////\n // MIXED (GENERIC)\n ///////////////////\n\n /droid .+?; ([^;]+?)(?: bui|; wv\\)|\\) applew).+?(mobile|vr|\\d) safari/i\n ], [MODEL, [TYPE, strMapper, { 'mobile' : 'Mobile', 'xr' : 'VR', '*' : TABLET }]], [\n /\\b((tablet|tab)[;\\/]|focus\\/\\d(?!.+mobile))/i // Unidentifiable Tablet\n ], [[TYPE, TABLET]], [\n /(phone|mobile(?:[;\\/]| [ \\w\\/\\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile\n ], [[TYPE, MOBILE]], [\n /droid .+?; ([\\w\\. -]+)( bui|\\))/i // Generic Android Device\n ], [MODEL, [VENDOR, 'Generic']]\n ],\n\n engine : [[\n\n /windows.+ edge\\/([\\w\\.]+)/i // EdgeHTML\n ], [VERSION, [NAME, EDGE+'HTML']], [\n\n /(arkweb)\\/([\\w\\.]+)/i // ArkWeb\n ], [NAME, VERSION], [\n\n /webkit\\/537\\.36.+chrome\\/(?!27)([\\w\\.]+)/i // Blink\n ], [VERSION, [NAME, 'Blink']], [\n\n /(presto)\\/([\\w\\.]+)/i, // Presto\n /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\\/([\\w\\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna/Servo\n /ekioh(flow)\\/([\\w\\.]+)/i, // Flow\n /(khtml|tasman|links)[\\/ ]\\(?([\\w\\.]+)/i, // KHTML/Tasman/Links\n /(icab)[\\/ ]([23]\\.[\\d\\.]+)/i, // iCab\n\n /\\b(libweb)/i // LibWeb\n ], [NAME, VERSION], [\n /ladybird\\//i\n ], [[NAME, 'LibWeb']], [\n\n /rv\\:([\\w\\.]{1,9})\\b.+(gecko)/i // Gecko\n ], [VERSION, NAME]\n ],\n\n os : [[\n\n // Windows\n /(windows nt) (6\\.[23]); arm/i // Windows RT\n ], [[NAME, /N/, 'R'], [VERSION, strMapper, windowsVersionMap]], [\n /(windows (?:phone|mobile|iot))(?: os)?[\\/ ]?([\\d\\.]*( se)?)/i, // Windows IoT/Mobile/Phone\n // Windows NT/3.1/95/98/ME/2000/XP/Vista/7/8/8.1/10/11\n /(windows)[\\/ ](1[01]|2000|3\\.1|7|8(\\.1)?|9[58]|me|server 20\\d\\d( r2)?|vista|xp)/i\n ], [NAME, VERSION], [\n /windows nt ?([\\d\\.\\)]*)(?!.+xbox)/i,\n /\\bwin(?=3| ?9|n)(?:nt| 9x )?([\\d\\.;]*)/i\n ], [[VERSION, /(;|\\))/g, '', strMapper, windowsVersionMap], [NAME, WINDOWS]], [\n /(windows ce)\\/?([\\d\\.]*)/i // Windows CE\n ], [NAME, VERSION], [\n\n // iOS/macOS\n /[adehimnop]{4,7}\\b(?:.*os ([\\w]+) like mac|; opera)/i, // iOS\n /(?:ios;fbsv\\/|iphone.+ios[\\/ ])([\\d\\.]+)/i,\n /cfnetwork\\/.+darwin/i\n ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [\n /(mac os x) ?([\\w\\. ]*)/i,\n /(macintosh|mac_powerpc\\b)(?!.+(haiku|morphos))/i // Mac OS\n ], [[NAME, 'macOS'], [VERSION, /_/g, '.']], [\n\n // Google Chromecast\n /android ([\\d\\.]+).*crkey/i // Google Chromecast, Android-based\n ], [VERSION, [NAME, CHROMECAST + ' Android']], [\n /fuchsia.*crkey\\/([\\d\\.]+)/i // Google Chromecast, Fuchsia-based\n ], [VERSION, [NAME, CHROMECAST + ' Fuchsia']], [\n /crkey\\/([\\d\\.]+).*devicetype\\/smartspeaker/i // Google Chromecast, Linux-based Smart Speaker\n ], [VERSION, [NAME, CHROMECAST + ' SmartSpeaker']], [\n /linux.*crkey\\/([\\d\\.]+)/i // Google Chromecast, Legacy Linux-based\n ], [VERSION, [NAME, CHROMECAST + ' Linux']], [\n /crkey\\/([\\d\\.]+)/i // Google Chromecast, unknown\n ], [VERSION, [NAME, CHROMECAST]], [\n\n // Mobile OSes\n /droid ([\\w\\.]+)\\b.+(android[- ]x86)/i // Android-x86\n ], [VERSION, NAME], [ \n /(ubuntu) ([\\w\\.]+) like android/i // Ubuntu Touch\n ], [[NAME, /(.+)/, '$1 Touch'], VERSION], [\n /(harmonyos)[\\/ ]?([\\d\\.]*)/i, // HarmonyOS\n // Android/Blackberry/WebOS/QNX/Bada/RIM/KaiOS/Maemo/MeeGo/S40/Sailfish OS/OpenHarmony/Tizen\n /(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\\w*[-\\/\\.; ]?([\\d\\.]*)/i\n ], [NAME, VERSION], [\n /\\(bb(10);/i // BlackBerry 10\n ], [VERSION, [NAME, BLACKBERRY]], [\n /(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\\/ ]?([\\w\\.]*)/i // Symbian\n ], [VERSION, [NAME, 'Symbian']], [\n /mozilla\\/[\\d\\.]+ \\((?:mobile|tablet|tv|mobile; [\\w ]+); rv:.+ gecko\\/([\\w\\.]+)/i // Firefox OS\n ], [VERSION, [NAME, FIREFOX+' OS']], [\n /\\b(?:hp)?wos(?:browser)?\\/([\\w\\.]+)/i, // WebOS\n /webos(?:[ \\/]?|\\.tv-20(?=2[2-9]))(\\d[\\d\\.]*)/i\n ], [VERSION, [NAME, 'webOS']], [\n /web0s;.+?(?:chr[o0]me|safari)\\/(\\d+)/i\n // https://webostv.developer.lge.com/develop/specifications/web-api-and-web-engine\n ], [[VERSION, strMapper, {'25':'120','24':'108','23':'94','22':'87','6':'79','5':'68','4':'53','3':'38','2':'538','1':'537','*':'TV'}], [NAME, 'webOS']], [ \n /watch(?: ?os[,\\/]|\\d,\\d\\/)([\\d\\.]+)/i // watchOS\n ], [VERSION, [NAME, 'watchOS']], [\n\n // Google ChromeOS\n /(cros) [\\w]+(?:\\)| ([\\w\\.]+)\\b)/i // Chromium OS\n ], [[NAME, \"Chrome OS\"], VERSION],[\n\n // Smart TVs\n /panasonic;(viera)/i, // Panasonic Viera\n /(netrange)mmh/i, // Netrange\n /(nettv)\\/(\\d+\\.[\\w\\.]+)/i, // NetTV\n\n // Console\n /(nintendo|playstation) (\\w+)/i, // Nintendo/Playstation\n /(xbox); +xbox ([^\\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)\n /(pico) .+os([\\w\\.]+)/i, // Pico\n\n // Other\n /\\b(joli|palm)\\b ?(?:os)?\\/?([\\w\\.]*)/i, // Joli/Palm\n /linux.+(mint)[\\/\\(\\) ]?([\\w\\.]*)/i, // Mint\n /(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\\d\\.]*)/i, // Mageia/VectorLinux/Fuchsia/ArcaOS/Arch\n /([kxln]?ubuntu|debian|suse|opensuse|gentoo|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire|knoppix)(?: gnu[\\/ ]linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\\/ ]?(?!chrom|package)([-\\w\\.]*)/i,\n // Ubuntu/Debian/SUSE/Gentoo/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire/Knoppix\n /((?:open)?solaris)[-\\/ ]?([\\w\\.]*)/i, // Solaris\n /\\b(aix)[; ]([1-9\\.]{0,4})/i, // AIX\n /(hurd|linux|morphos)(?: (?:arm|x86|ppc)\\w*| ?)([\\w\\.]*)/i, // Hurd/Linux/MorphOS\n /(gnu) ?([\\w\\.]*)/i, // GNU\n /\\b([-frentopcghs]{0,5}bsd|dragonfly)[\\/ ]?(?!amd|[ix346]{1,2}86)([\\w\\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly\n /(haiku) ?(r\\d)?/i // Haiku\n ], [NAME, VERSION], [\n /(sunos) ?([\\d\\.]*)/i // Solaris\n ], [[NAME, 'Solaris'], VERSION], [\n /\\b(beos|os\\/2|amigaos|openvms|hp-ux|serenityos)/i, // BeOS/OS2/AmigaOS/OpenVMS/HP-UX/SerenityOS\n /(unix) ?([\\w\\.]*)/i // UNIX\n ], [NAME, VERSION]\n ]\n };\n\n /////////////////\n // Factories\n ////////////////\n\n var defaultProps = (function () {\n var props = { init : {}, isIgnore : {}, isIgnoreRgx : {}, toString : {}};\n setProps.call(props.init, [\n [UA_BROWSER, [NAME, VERSION, MAJOR, TYPE]],\n [UA_CPU, [ARCHITECTURE]],\n [UA_DEVICE, [TYPE, MODEL, VENDOR]],\n [UA_ENGINE, [NAME, VERSION]],\n [UA_OS, [NAME, VERSION]]\n ]);\n setProps.call(props.isIgnore, [\n [UA_BROWSER, [VERSION, MAJOR]],\n [UA_ENGINE, [VERSION]],\n [UA_OS, [VERSION]]\n ]);\n setProps.call(props.isIgnoreRgx, [\n [UA_BROWSER, / ?browser$/i],\n [UA_OS, / ?os$/i]\n ]);\n setProps.call(props.toString, [\n [UA_BROWSER, [NAME, VERSION]],\n [UA_CPU, [ARCHITECTURE]],\n [UA_DEVICE, [VENDOR, MODEL]],\n [UA_ENGINE, [NAME, VERSION]],\n [UA_OS, [NAME, VERSION]]\n ]);\n return props;\n })();\n\n var createIData = function (item, itemType) {\n\n var init_props = defaultProps.init[itemType],\n is_ignoreProps = defaultProps.isIgnore[itemType] || 0,\n is_ignoreRgx = defaultProps.isIgnoreRgx[itemType] || 0,\n toString_props = defaultProps.toString[itemType] || 0;\n\n function IData () {\n setProps.call(this, init_props);\n }\n\n IData.prototype.getItem = function () {\n return item;\n };\n\n IData.prototype.withClientHints = function () {\n\n // nodejs / non-client-hints browsers\n if (!NAVIGATOR_UADATA) {\n return item\n .parseCH()\n .get();\n }\n\n // browsers based on chromium 85+\n return NAVIGATOR_UADATA\n .getHighEntropyValues(CH_ALL_VALUES)\n .then(function (res) {\n return item\n .setCH(new UACHData(res, false))\n .parseCH()\n .get();\n });\n };\n\n IData.prototype.withFeatureCheck = function () {\n return item.detectFeature().get();\n };\n\n if (itemType != UA_RESULT) {\n IData.prototype.is = function (strToCheck) {\n var is = false;\n for (var i in this) {\n if (this.hasOwnProperty(i) && !has(is_ignoreProps, i) && lowerize(is_ignoreRgx ? strip(is_ignoreRgx, this[i]) : this[i]) == lowerize(is_ignoreRgx ? strip(is_ignoreRgx, strToCheck) : strToCheck)) {\n is = true;\n if (strToCheck != UNDEF_TYPE) break;\n } else if (strToCheck == UNDEF_TYPE && is) {\n is = !is;\n break;\n }\n }\n return is;\n };\n IData.prototype.toString = function () {\n var str = EMPTY;\n for (var i in toString_props) {\n if (typeof(this[toString_props[i]]) !== UNDEF_TYPE) {\n str += (str ? ' ' : EMPTY) + this[toString_props[i]];\n }\n }\n return str || UNDEF_TYPE;\n };\n }\n\n if (!NAVIGATOR_UADATA) {\n IData.prototype.then = function (cb) { \n var that = this;\n var IDataResolve = function () {\n for (var prop in that) {\n if (that.hasOwnProperty(prop)) {\n this[prop] = that[prop];\n }\n }\n };\n IDataResolve.prototype = {\n is : IData.prototype.is,\n toString : IData.prototype.toString\n };\n var resolveData = new IDataResolve();\n cb(resolveData);\n return resolveData;\n };\n }\n\n return new IData();\n };\n\n /////////////////\n // Constructor\n ////////////////\n\n function UACHData (uach, isHttpUACH) {\n uach = uach || {};\n setProps.call(this, CH_ALL_VALUES);\n if (isHttpUACH) {\n setProps.call(this, [\n [BRANDS, itemListToArray(uach[CH_HEADER])],\n [FULLVERLIST, itemListToArray(uach[CH_HEADER_FULL_VER_LIST])],\n [MOBILE, /\\?1/.test(uach[CH_HEADER_MOBILE])],\n [MODEL, stripQuotes(uach[CH_HEADER_MODEL])],\n [PLATFORM, stripQuotes(uach[CH_HEADER_PLATFORM])],\n [PLATFORMVER, stripQuotes(uach[CH_HEADER_PLATFORM_VER])],\n [ARCHITECTURE, stripQuotes(uach[CH_HEADER_ARCH])],\n [FORMFACTORS, itemListToArray(uach[CH_HEADER_FORM_FACTORS])],\n [BITNESS, stripQuotes(uach[CH_HEADER_BITNESS])]\n ]);\n } else {\n for (var prop in uach) {\n if(this.hasOwnProperty(prop) && typeof uach[prop] !== UNDEF_TYPE) this[prop] = uach[prop];\n }\n }\n }\n\n function UAItem (itemType, ua, rgxMap, uaCH) {\n\n this.get = function (prop) {\n if (!prop) return this.data;\n return this.data.hasOwnProperty(prop) ? this.data[prop] : undefined;\n };\n\n this.set = function (prop, val) {\n this.data[prop] = val;\n return this;\n };\n\n this.setCH = function (ch) {\n this.uaCH = ch;\n return this;\n };\n\n this.detectFeature = function () {\n if (NAVIGATOR && NAVIGATOR.userAgent == this.ua) {\n switch (this.itemType) {\n case UA_BROWSER:\n // Brave-specific detection\n if (NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == FUNC_TYPE) {\n this.set(NAME, 'Brave');\n }\n break;\n case UA_DEVICE:\n // Chrome-specific detection: check for 'mobile' value of navigator.userAgentData\n if (!this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) {\n this.set(TYPE, MOBILE);\n }\n // iPadOS-specific detection: identified as Mac, but has some iOS-only properties\n if (this.get(MODEL) == 'Macintosh' && NAVIGATOR && typeof NAVIGATOR.standalone !== UNDEF_TYPE && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 2) {\n this.set(MODEL, 'iPad')\n .set(TYPE, TABLET);\n }\n break;\n case UA_OS:\n // Chrome-specific detection: check for 'platform' value of navigator.userAgentData\n if (!this.get(NAME) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[PLATFORM]) {\n this.set(NAME, NAVIGATOR_UADATA[PLATFORM]);\n }\n break;\n case UA_RESULT:\n var data = this.data;\n var detect = function (itemType) {\n return data[itemType]\n .getItem()\n .detectFeature()\n .get();\n };\n this.set(UA_BROWSER, detect(UA_BROWSER))\n .set(UA_CPU, detect(UA_CPU))\n .set(UA_DEVICE, detect(UA_DEVICE))\n .set(UA_ENGINE, detect(UA_ENGINE))\n .set(UA_OS, detect(UA_OS));\n }\n }\n return this;\n };\n\n this.parseUA = function () {\n if (this.itemType != UA_RESULT) {\n rgxMapper.call(this.data, this.ua, this.rgxMap);\n }\n if (this.itemType == UA_BROWSER) {\n this.set(MAJOR, majorize(this.get(VERSION)));\n }\n return this;\n };\n\n this.parseCH = function () {\n var uaCH = this.uaCH,\n rgxMap = this.rgxMap;\n \n switch (this.itemType) {\n case UA_BROWSER:\n case UA_ENGINE:\n var brands = uaCH[FULLVERLIST] || uaCH[BRANDS], prevName;\n if (brands) {\n for (var i in brands) {\n var brandName = brands[i].brand || brands[i],\n brandVersion = brands[i].version;\n if (this.itemType == UA_BROWSER && \n !/not.a.brand/i.test(brandName) && \n (!prevName || \n (/Chrom/.test(prevName) && brandName != CHROMIUM) || \n (prevName == EDGE && /WebView2/.test(brandName))\n )) {\n brandName = strMapper(brandName, browserHintsMap);\n prevName = this.get(NAME);\n if (!(prevName && !/Chrom/.test(prevName) && /Chrom/.test(brandName))) {\n this.set(NAME, brandName)\n .set(VERSION, brandVersion)\n .set(MAJOR, majorize(brandVersion));\n }\n prevName = brandName;\n }\n if (this.itemType == UA_ENGINE && brandName == CHROMIUM) {\n this.set(VERSION, brandVersion);\n }\n }\n }\n break;\n case UA_CPU:\n var archName = uaCH[ARCHITECTURE];\n if (archName) {\n if (archName && uaCH[BITNESS] == '64') archName += '64';\n rgxMapper.call(this.data, archName + ';', rgxMap);\n }\n break;\n case UA_DEVICE:\n if (uaCH[MOBILE]) {\n this.set(TYPE, MOBILE);\n }\n if (uaCH[MODEL]) {\n this.set(MODEL, uaCH[MODEL]);\n if (!this.get(TYPE) || !this.get(VENDOR)) {\n var reParse = {};\n rgxMapper.call(reParse, 'droid 9; ' + uaCH[MODEL] + ')', rgxMap);\n if (!this.get(TYPE) && !!reParse.type) {\n this.set(TYPE, reParse.type);\n }\n if (!this.get(VENDOR) && !!reParse.vendor) {\n this.set(VENDOR, reParse.vendor);\n }\n }\n }\n if (uaCH[FORMFACTORS]) {\n var ff;\n if (typeof uaCH[FORMFACTORS] !== 'string') {\n var idx = 0;\n while (!ff && idx < uaCH[FORMFACTORS].length) {\n ff = strMapper(uaCH[FORMFACTORS][idx++], formFactorsMap);\n }\n } else {\n ff = strMapper(uaCH[FORMFACTORS], formFactorsMap);\n }\n this.set(TYPE, ff);\n }\n break;\n case UA_OS:\n var osName = uaCH[PLATFORM];\n if(osName) {\n var osVersion = uaCH[PLATFORMVER];\n if (osName == WINDOWS) osVersion = (parseInt(majorize(osVersion), 10) >= 13 ? '11' : '10');\n this.set(NAME, osName)\n .set(VERSION, osVersion);\n }\n // Xbox-Specific Detection\n if (this.get(NAME) == WINDOWS && uaCH[MODEL] == 'Xbox') {\n this.set(NAME, 'Xbox')\n .set(VERSION, undefined);\n } \n break;\n case UA_RESULT:\n var data = this.data;\n var parse = function (itemType) {\n return data[itemType]\n .getItem()\n .setCH(uaCH)\n .parseCH()\n .get();\n };\n this.set(UA_BROWSER, parse(UA_BROWSER))\n .set(UA_CPU, parse(UA_CPU))\n .set(UA_DEVICE, parse(UA_DEVICE))\n .set(UA_ENGINE, parse(UA_ENGINE))\n .set(UA_OS, parse(UA_OS));\n }\n return this;\n };\n\n setProps.call(this, [\n ['itemType', itemType],\n ['ua', ua],\n ['uaCH', uaCH],\n ['rgxMap', rgxMap],\n ['data', createIData(this, itemType)]\n ]);\n\n return this;\n }\n\n function UAParser (ua, extensions, headers) {\n\n if (typeof ua === OBJ_TYPE) {\n if (isExtensions(ua, true)) {\n if (typeof extensions === OBJ_TYPE) {\n headers = extensions; // case UAParser(extensions, headers) \n }\n extensions = ua; // case UAParser(extensions)\n } else {\n headers = ua; // case UAParser(headers)\n extensions = undefined;\n }\n ua = undefined;\n } else if (typeof ua === STR_TYPE && !isExtensions(extensions, true)) {\n headers = extensions; // case UAParser(ua, headers)\n extensions = undefined;\n }\n\n // Convert Headers object into a plain object\n if (headers && typeof headers.append === FUNC_TYPE) {\n var kv = {};\n headers.forEach(function (v, k) { kv[k] = v; });\n headers = kv;\n }\n \n if (!(this instanceof UAParser)) {\n return new UAParser(ua, extensions, headers).getResult();\n }\n\n var userAgent = typeof ua === STR_TYPE ? ua : // Passed user-agent string\n (headers && headers[USER_AGENT] ? headers[USER_AGENT] : // User-Agent from passed headers\n ((NAVIGATOR && NAVIGATOR.userAgent) ? NAVIGATOR.userAgent : // navigator.userAgent\n EMPTY)), // empty string\n\n httpUACH = new UACHData(headers, true),\n regexMap = extensions ? \n extend(defaultRegexes, extensions) : \n defaultRegexes,\n\n createItemFunc = function (itemType) {\n if (itemType == UA_RESULT) {\n return function () {\n return new UAItem(itemType, userAgent, regexMap, httpUACH)\n .set('ua', userAgent)\n .set(UA_BROWSER, this.getBrowser())\n .set(UA_CPU, this.getCPU())\n .set(UA_DEVICE, this.getDevice())\n .set(UA_ENGINE, this.getEngine())\n .set(UA_OS, this.getOS())\n .get();\n };\n } else {\n return function () {\n return new UAItem(itemType, userAgent, regexMap[itemType], httpUACH)\n .parseUA()\n .get();\n };\n }\n };\n \n // public methods\n setProps.call(this, [\n ['getBrowser', createItemFunc(UA_BROWSER)],\n ['getCPU', createItemFunc(UA_CPU)],\n ['getDevice', createItemFunc(UA_DEVICE)],\n ['getEngine', createItemFunc(UA_ENGINE)],\n ['getOS', createItemFunc(UA_OS)],\n ['getResult', createItemFunc(UA_RESULT)],\n ['getUA', function () { return userAgent; }],\n ['setUA', function (ua) {\n if (isString(ua))\n userAgent = ua.length > UA_MAX_LENGTH ? trim(ua, UA_MAX_LENGTH) : ua;\n return this;\n }]\n ])\n .setUA(userAgent);\n\n return this;\n }\n\n UAParser.VERSION = LIBVERSION;\n UAParser.BROWSER = enumerize([NAME, VERSION, MAJOR, TYPE]);\n UAParser.CPU = enumerize([ARCHITECTURE]);\n UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);\n UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);\n\n export {UAParser};","import { UAParser } from \"ua-parser-js\";\nimport { DeviceOs } from \"../../core\";\n\nexport const getOs = async (): Promise<DeviceOs> => {\n const parser = new UAParser(navigator.userAgent);\n const result = parser.getResult();\n return { ...result.os, device_type: getDeviceType() };\n};\n\nconst getDeviceType = () => {\n const w = window.innerWidth;\n if (w <= 767) return 'mobile';\n if (w <= 1024) return 'tablet';\n return 'desktop';\n};\n","import {\n ALLOWED_DEVICE_TYPES,\n ALLOWED_OS,\n AllowedOs,\n DeviceType,\n} from '../../../core';\n\n// Normalize the gueesed Os\nexport const normalizeOs = (\n platform: string | undefined | null\n): AllowedOs | null => {\n if (!platform) return null;\n const lowerPlatform = platform.toLowerCase();\n\n if (lowerPlatform.includes(\"android\")) return \"android\";\n if (\n lowerPlatform.includes(\"iphone\") ||\n lowerPlatform.includes(\"ipad\") ||\n lowerPlatform === \"ios\"\n )\n return \"ios\";\n if (lowerPlatform.includes(\"win\")) return \"windows\";\n if (lowerPlatform.includes(\"mac\") || lowerPlatform.includes(\"macos\"))\n return \"macos\";\n if (lowerPlatform.includes(\"linux\")) return \"linux\";\n // if (lowerPlatform.includes(\"cros\")) return \"linux\"; // Example extension\n\n return null;\n};\n\nconst patterns = {\n ios: [/apple a\\d+ gpu/i],\n macos: [/apple m\\d+/i, /opengl engine/i],\n windows: [/angle.*direct3d/i],\n android: [/adreno|mali|powervr/i],\n linux: [/mesa|x11/i],\n};\n\n// Detect the actual OS from the GPU vendor and renderer if available\nexport const detectActualOs = (renderer: string): AllowedOs | null => {\n if (patterns.ios.some((pattern) => pattern.test(renderer))) {\n return \"ios\";\n } else if (patterns.macos.some((pattern) => pattern.test(renderer))) {\n return \"macos\";\n } else if (patterns.windows.some((pattern) => pattern.test(renderer))) {\n return \"windows\";\n } else if (patterns.android.some((pattern) => pattern.test(renderer))) {\n return \"android\";\n } else if (\n patterns.linux.some((pattern) => pattern.test(renderer)) ||\n /NVIDIA|AMD|Intel/i.test(renderer)\n ) {\n return \"linux\";\n } else {\n return null;\n }\n};\n\nexport const determineDeviceType = (\n claimedMobile: boolean | null,\n hasTouch: boolean,\n screenWidth: number,\n realOs: AllowedOs | null\n): DeviceType | null => {\n // Determine the real device type from the os\n if (realOs === \"ios\" || realOs === \"android\") {\n return screenWidth > 768 ? \"tablet\" : \"mobile\";\n }\n\n if (realOs === \"windows\" || realOs === \"macos\" || realOs === \"linux\") {\n return \"desktop\";\n }\n\n // check using touch attributes if the os couldn't determine device type\n if (hasTouch) {\n if (screenWidth < 600) return \"mobile\";\n if (screenWidth <= 1024) return \"tablet\";\n if (claimedMobile === false) return \"desktop\"; // Likely touch laptop\n return \"tablet\"; // Default large touch to tablet\n }\n\n if (!hasTouch) {\n return \"desktop\";\n }\n\n return null;\n};\n\nexport const guessDeviceTypeFromUA = (ua: string): DeviceType | null => {\n const lowerUa = ua.toLowerCase();\n if (/(tablet|ipad|playbook|silk)|(android(?!.*mobi))/i.test(lowerUa)) {\n return \"tablet\";\n }\n if (\n /Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Kindle|Silk-Accelerated|hpwos|Opera M(obi|ini)/i.test(\n lowerUa\n )\n ) {\n return \"mobile\";\n }\n if (\n lowerUa.includes(\"windows nt\") ||\n lowerUa.includes(\"macintosh\") ||\n lowerUa.includes(\"x11\")\n ) {\n return \"desktop\";\n }\n return null;\n};\n\nexport const convertToTwoDP = (num: number): number => {\n return parseFloat(num.toFixed(2));\n};\n\nexport const isAllowedOs = (os: string): os is AllowedOs => {\n return !!os && (ALLOWED_OS as readonly string[]).includes(os);\n};\n\nexport const isAllowedDeviceType = (\n type: DeviceType | null\n): type is DeviceType => {\n return !!type && (ALLOWED_DEVICE_TYPES as readonly string[]).includes(type);\n};\n","import { DeviceResults, AllowedOs, DeviceType } from '../../../core';\nimport { normalizeOs, determineDeviceType, convertToTwoDP, isAllowedDeviceType, detectActualOs } from './helpers';\n\ntype ClaimedData = DeviceResults['claimed'];\ntype SignalData = DeviceResults['signals'];\ntype AnalysisData = DeviceResults['analysis'];\n\nexport const analyzeSpoofing = (claimed: ClaimedData, signals: SignalData): AnalysisData => {\n const MAX_CONFIDENCE_SCORE = 1.0;\n let score = MAX_CONFIDENCE_SCORE;\n const conflicts: string[] = [];\n const analysis: AnalysisData = {\n confidence: MAX_CONFIDENCE_SCORE,\n spoofingConfidence: 0.0,\n isSpoofed: false,\n detectionConflicts: [],\n realPlatform: null,\n realDeviceType: null,\n };\n\n const hasTouch = signals.touchPoints > 0;\n const screenWidth = signals.screen.width;\n\n const claimedOs = normalizeOs(claimed.platform);\n const gpuOs = detectActualOs(signals.webGL.renderer?.toLowerCase() || '');\n const platformOs = normalizeOs(signals.actualPlatform);\n const actualOs = gpuOs || platformOs;\n let suspectedOs: AllowedOs | null = claimedOs;\n\n // --- Apply Rules ---\n\n // Rule 1: Os Mismatch\n if (claimedOs && actualOs && claimedOs !== actualOs) {\n score -= 0.3;\n conflicts.push(`Claimed OS \"${claimedOs}\" disagrees with actual OS signal \"${actualOs}\".`);\n suspectedOs = actualOs; // Trust actual signal more initially\n } else if (claimedOs && !actualOs && claimed.platform !== '') {\n score -= 0.2;\n conflicts.push(`Actual OS signal \"${signals.actualPlatform}\" is unrecognized.`);\n suspectedOs = claimedOs;\n } else if (!claimedOs && actualOs) {\n score -= 0.2;\n conflicts.push(`Claimed OS signal \"${claimed.platform}\" is unrecognized.`);\n suspectedOs = actualOs;\n }\n\n // Rule 2: GPU Vendor vs Determined Preliminary OS\n const gpuVendor = (signals.webGL.vendor || \"\").toLowerCase();\n const gpuRenderer = (signals.webGL.renderer || \"\").toLowerCase();\n\n if (gpuVendor && gpuVendor !== 'n/a' && gpuVendor !== 'n/a (masked)') {\n let gpuConflict = false;\n let gpuSuggestedOs: AllowedOs | null = null;\n\n if (suspectedOs === 'android' && (gpuVendor.includes('apple') || gpuRenderer.includes('apple'))) { gpuConflict = true; gpuSuggestedOs = 'ios'; }\n else if (suspectedOs === 'ios' && !gpuVendor.includes('apple') && !gpuRenderer.includes('apple')) {\n gpuConflict = true;\n if (gpuVendor.includes('qualcomm') || gpuVendor.includes('adreno') || gpuVendor.includes('mali') || gpuVendor.includes('powervr') || gpuVendor.includes('arm')) { gpuSuggestedOs = 'android'; }\n else if (gpuVendor.includes('intel') || gpuRenderer.includes('intel') || gpuVendor.includes('nvidia') || gpuRenderer.includes('nvidia') || gpuVendor.includes('amd') || gpuRenderer.includes('amd') || gpuRenderer.includes('radeon')) { gpuSuggestedOs = 'windows'; }\n else { gpuSuggestedOs = 'android'; }\n }\n else if (suspectedOs === 'windows' && (gpuVendor.includes('apple') || gpuRenderer.includes('apple'))) { gpuConflict = true; gpuSuggestedOs = 'macos'; }\n else if (suspectedOs === 'macos' && !(gpuVendor.includes('apple') || gpuRenderer.includes('apple') || gpuVendor.includes('intel') || gpuRenderer.includes('intel') || gpuVendor.includes('amd') || gpuRenderer.includes('amd') || gpuRenderer.includes('radeon'))) {\n gpuConflict = true;\n if (gpuVendor.includes('qualcomm') || gpuVendor.includes('adreno') || gpuVendor.includes('mali') || gpuVendor.includes('powervr') || gpuVendor.includes('arm')) { gpuSuggestedOs = 'android'; }\n else { gpuSuggestedOs = 'windows'; }\n }\n\n if (gpuConflict) {\n score -= 0.5;\n conflicts.push(`OS \"${suspectedOs}\" conflicts with GPU \"${signals.webGL.vendor} / ${signals.webGL.renderer}\". GPU suggests \"${gpuSuggestedOs || 'unknown'}\".`);\n if (gpuSuggestedOs) { suspectedOs = gpuSuggestedOs; }\n }\n // Add logic here for suspicious but not conflicting GPUs if desired (e.g., Intel GPU on Android)\n } else if (signals.webGL.error) {\n score -= 0.1;\n conflicts.push(`WebGL info unavailable (${signals.webGL.error}).`);\n }\n\n\n // Rule 3: Claimed Device Type vs Touch Support\n let preliminaryRealDeviceType: DeviceType | null = null;\n const normalizedClaimedType = isAllowedDeviceType(claimed.guessedDeviceType) ? claimed.guessedDeviceType : null;\n\n if (claimed.mobile === true && !hasTouch) {\n score -= 0.3;\n conflicts.push(`Claimed mobile=true but no touch points detected.`);\n preliminaryRealDeviceType = 'desktop';\n } else if (claimed.mobile === false && hasTouch) {\n score -= 0.15;\n conflicts.push(`Claimed mobile=false but touch points detected.`);\n preliminaryRealDeviceType = determineDeviceType(claimed.mobile, hasTouch, screenWidth, suspectedOs);\n } else if (normalizedClaimedType) {\n // If claimed type exists and doesn't conflict strongly with touch, use it as preliminary\n preliminaryRealDeviceType = normalizedClaimedType;\n }\n\n\n // Rule 4: Screen Size vs Preliminary Device Type Sanity Check\n const typicalMobileWidth = 768;\n const typicalTabletWidth = 1024;\n\n if (preliminaryRealDeviceType === 'mobile' && screenWidth > typicalTabletWidth) {\n score -= 0.15;\n conflicts.push(`Device type 'mobile', but screen width (${screenWidth}px) is large.`);\n preliminaryRealDeviceType = 'tablet';\n } else if (preliminaryRealDeviceType === 'desktop' && screenWidth < typicalMobileWidth) {\n score -= 0.15;\n conflicts.push(`Preliminary type 'desktop', but screen width (${screenWidth}px) is small.`);\n preliminaryRealDeviceType = hasTouch ? 'mobile' : 'desktop';\n }\n\n // --- Finalize Analysis ---\n // We use the suspected Os but fallback to the claimed os of the ua if null\n analysis.realPlatform = suspectedOs || claimedOs;\n\n // Determine final device type\n const determinedType = determineDeviceType(claimed.mobile, hasTouch, screenWidth, analysis.realPlatform);\n\n if (!preliminaryRealDeviceType) {\n analysis.realDeviceType = determinedType;\n } else {\n // Check if the determined type based on final signals contradicts the preliminary one\n if (determinedType && determinedType !== preliminaryRealDeviceType) {\n score -= 0.12; // Small penalty for internal inconsistency\n conflicts.push(`Initial device type guess (${preliminaryRealDeviceType}) adjusted to ${determinedType} based on final signals.`);\n analysis.realDeviceType = determinedType;\n } else {\n analysis.realDeviceType = preliminaryRealDeviceType;\n }\n }\n\n // Ensure device type is populated based on OS if still null\n if (!analysis.realDeviceType) {\n if (analysis.realPlatform === 'ios' || analysis.realPlatform === 'android') {\n analysis.realDeviceType = determinedType || 'mobile';\n } else if (analysis.realPlatform) { // windows, macos, linux\n analysis.realDeviceType = determinedType || 'desktop';\n } else { // OS unknown\n analysis.realDeviceType = hasTouch ? (screenWidth > 768 ? 'tablet' : 'mobile') : 'desktop';\n }\n }\n\n analysis.confidence = convertToTwoDP(Math.max(0, score));\n analysis.spoofingConfidence = convertToTwoDP(MAX_CONFIDENCE_SCORE - analysis.confidence);\n analysis.isSpoofed = analysis.spoofingConfidence > 0.1;\n analysis.detectionConflicts = conflicts;\n\n return analysis;\n};","import {\n RefinedDeviceResults,\n deviceTampering,\n DeviceResults,\n} from \"../../../core\";\nimport { analyzeSpoofing } from \"./analyze-data\";\nimport { getClaimedData, getSignalData } from \"./gather-data\";\n\nexport const getDeviceDetails = async (): Promise<RefinedDeviceResults> => {\n // 1. Initialize structure\n const initialResults: DeviceResults = {\n claimed: {\n platform: \"\",\n mobile: false,\n brands: [],\n guessedDeviceType: null,\n },\n signals: {\n actualPlatform: \"\",\n touchPoints: 0,\n screen: { width: 0, height: 0, pixelRatio: 1 },\n webGL: { vendor: undefined, renderer: undefined, error: \"\" },\n userAgentString: \"\",\n },\n analysis: {\n confidence: 1.0,\n spoofingConfidence: 0.0,\n isSpoofed: false,\n detectionConflicts: [],\n realPlatform: null,\n realDeviceType: null,\n },\n };\n\n // 2. Gather Signals (Sync first)\n const signals = getSignalData();\n initialResults.signals = signals;\n\n // 3. Gather Claimed Data (Async) - Pass UA string from signals\n const claimed = await getClaimedData(signals.userAgentString);\n initialResults.claimed = claimed;\n\n // 4. Analyze Data\n const analysis = analyzeSpoofing(claimed, signals);\n initialResults.analysis = analysis;\n\n // 5. Format Final Output\n const tamperingResult = (): deviceTampering => {\n if (analysis.isSpoofed) {\n return { status: true, confidence: analysis.spoofingConfidence };\n } else {\n return { status: false };\n }\n };\n\n const finalResults: RefinedDeviceResults = {\n ...initialResults,\n deviceOs: analysis.realPlatform,\n deviceType: analysis.realDeviceType,\n tampering: tamperingResult(),\n };\n\n return finalResults;\n};\n","import { DeviceResults, ClaimedDevice } from '../../../core';\nimport { guessDeviceTypeFromUA } from './helpers';\n\n\ntype SignalData = DeviceResults['signals'];\n\n// What the device claims to be is gotten from the useragent string\nexport const getClaimedData = async (userAgentString: string): Promise<ClaimedDevice> => {\n const claimed = {} as ClaimedDevice;\n\n try {\n if ((navigator as any).userAgentData) {\n const uaData = await (navigator as any).userAgentData.getHighEntropyValues([\n \"platform\", \"platformVersion\", \"architecture\", \"model\", \"uaFullVersion\", \"brands\", \"mobile\",\n ]);\n claimed.platform = uaData.platform;\n claimed.mobile = uaData.mobile ?? null;\n claimed.brands = uaData.brands || [];\n\n // Initial guess - will be refined later using signals if needed\n if (claimed.mobile) {\n claimed.guessedDeviceType = screen.width > 768 ? \"tablet\" : \"mobile\";\n } else {\n claimed.guessedDeviceType = \"desktop\";\n }\n } else {\n const ua = userAgentString;\n const lowerUa = ua.toLowerCase();\n\n // Determine the device platform from user agent string\n if (lowerUa.includes(\"android\")) claimed.platform = \"Android\";\n else if (lowerUa.includes(\"iphone\") || lowerUa.includes(\"ipad\")) claimed.platform = \"iOS\";\n else if (lowerUa.includes(\"windows nt\")) claimed.platform = \"Windows\";\n else if (lowerUa.includes(\"mac os x\") || lowerUa.includes(\"macintosh\")) claimed.platform = \"macOS\";\n else if (lowerUa.includes(\"linux\")) claimed.platform = \"Linux\";\n\n const guessedType = guessDeviceTypeFromUA(ua);\n claimed.guessedDeviceType = guessedType;\n claimed.mobile = guessedType === 'mobile' || guessedType === 'tablet';\n\n const brandMatch = ua.match(/(Apple|Samsung|Google|Microsoft|Sony|LG|HTC|Nokia|Motorola|Huawei|Xiaomi|Pixel|Firefox|Safari|Edge|Chrome)/i);\n if (brandMatch) {\n const versionMatch = ua.match(new RegExp(brandMatch[0] + \"[ /]([\\\\d._]+)\"));\n claimed.brands.push({ brand: brandMatch[0], version: versionMatch ? versionMatch[1] : \"unknown\" });\n }\n }\n } catch (e) {\n console.error(\"Error getting User Agent Data:\", e);\n }\n return claimed;\n};\n\n// What we actually think the device could be achieved from some of this signals\nexport const getSignalData = (): SignalData => {\n const signals: SignalData = {\n actualPlatform: (navigator as any).userAgentData?.platform || navigator.platform ,\n touchPoints: navigator.maxTouchPoints || 0,\n screen: {\n width: screen.width,\n height: screen.height,\n pixelRatio: window.devicePixelRatio || 1,\n },\n webGL: { vendor: undefined, renderer: undefined, error: \"\" },\n userAgentString: navigator.userAgent,\n };\n\n try {\n const canvas = document.createElement(\"canvas\");\n const gl = canvas.getContext(\"webgl2\") || canvas.getContext(\"webgl\") || canvas.getContext(\"experimental-webgl\");\n\n if (gl && 'getParameter' in gl) {\n const debugInfo = gl.getExtension(\"WEBGL_debug_renderer_info\");\n if (debugInfo) {\n signals.webGL.vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) || \"n/a\";\n signals.webGL.renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) || \"n/a\";\n } else {\n signals.webGL.vendor = gl.getParameter(gl.VENDOR) || \"n/a (masked)\";\n signals.webGL.renderer = gl.getParameter(gl.RENDERER) || \"n/a (masked)\";\n if (!signals.webGL.vendor || signals.webGL.vendor === \"n/a (masked)\") {\n signals.webGL.error = \"Debug info extension unavailable or vendor masked\";\n }\n }\n } else {\n signals.webGL.error = \"WebGL context unavailable\";\n }\n } catch (error) {\n console.error(\"Error getting WebGL data:\", error);\n signals.webGL.error = error instanceof Error ? error.message : \"Unknown WebGL error\";\n }\n\n return signals;\n};","import { detectBrowser } from \"../components/system/browser\";\n\nexport async function getBrowserDetails() {\n const { name, version } = detectBrowser();\n\n return {\n name,\n version,\n user_agent: navigator.userAgent,\n };\n}\n","export function getCommonPixels(images: ImageData[], width: number, height: number ): ImageData {\n let finalData: number[] = [];\n for (let i = 0; i < images[0].data.length; i++) {\n let indice: number[] = [];\n for (let u = 0; u < images.length; u++) {\n indice.push(images[u].data[i]);\n }\n finalData.push(getMostFrequent(indice));\n }\n\n const pixelData = finalData;\n const pixelArray = new Uint8ClampedArray(pixelData);\n return new ImageData(pixelArray, width, height);\n}\n\nfunction getMostFrequent(arr: number[]): number {\n if (arr.length === 0) {\n return 0; // Handle empty array case\n }\n \n const frequencyMap: { [key: number]: number } = {};\n \n // Count occurrences of each number in the array\n for (const num of arr) {\n frequencyMap[num] = (frequencyMap[num] || 0) + 1;\n }\n \n let mostFrequent: number = arr[0];\n \n // Find the number with the highest frequency\n for (const num in frequencyMap) {\n if (frequencyMap[num] > frequencyMap[mostFrequent]) {\n mostFrequent = parseInt(num, 10);\n }\n }\n \n return mostFrequent;\n }","import { componentInterface, includeComponent } from '../../factory'\n\nasync function createAudioFingerprint(): Promise<componentInterface> {\n const resultPromise = new Promise<componentInterface>((resolve, reject) => {\n try {\n // Set up audio parameters\n const sampleRate = 44100;\n const numSamples = 5000;\n const audioContext = new (window.OfflineAudioContext || (window as any).webkitOfflineAudioContext)(1, numSamples, sampleRate );\n const audioBuffer = audioContext.createBufferSource();\n\n const analyser = audioContext.createAnalyser();\n\n const frequencyData = new Float32Array(analyser.frequencyBinCount);\n analyser.getFloatFrequencyData(frequencyData);\n \n \n const oscillator = audioContext.createOscillator();\n oscillator.frequency.value = 1000;\n const compressor = audioContext.createDynamicsCompressor();\n compressor.threshold.value = -50;\n compressor.knee.value = 40;\n compressor.ratio.value = 12;\n compressor.attack.value = 0;\n compressor.release.value = 0.2;\n oscillator.connect(compressor);\n compressor.connect(audioContext.destination);\n oscillator.start();\n \n audioContext.oncomplete = () => {\n resolve(\n {\n 'oscillator': oscillator.type,\n 'maxChannels': audioContext.destination.maxChannelCount,\n 'channelCountMode': audioBuffer.channelCountMode,\n 'frequencyBinCount': analyser.frequencyBinCount,\n \n } \n );\n };\n \n audioContext.startRendering();\n \n // audioContext.close();\n \n } catch (error) {\n console.error('Error creating audio fingerprint:', error);\n reject(error);\n }\n \n });\n \n return resultPromise;\n\n}\n\n\nincludeComponent('audio', createAudioFingerprint);","import { componentInterface, includeComponent } from '../../factory'\nimport { hash } from '../../utils/hash'\nimport { getCommonPixels } from '../../utils/commonPixels';\nimport { getBrowserName } from '../system/browser';\n\nconst _RUNS = (getBrowserName() !== 'SamsungBrowser') ? 1 : 3;\n\n/**\n * A simple canvas finger printing function\n * \n * @returns a CanvasInfo JSON object\n */\n\nconst _WIDTH = 280;\nconst _HEIGHT = 20;\n\nexport default function generateCanvasFingerprint(): Promise<componentInterface> {\n \n return new Promise((resolve) => {\n\n /**\n * Since some browsers fudge with the canvas pixels to prevent fingerprinting, the following\n * creates the canvas three times and getCommonPixels picks the most common byte for each\n * channel of each pixel.\n */\n const imageDatas: ImageData[] = Array.from({length: _RUNS}, () => generateCanvasImageData() );\n const commonImageData = getCommonPixels(imageDatas, _WIDTH, _HEIGHT);\n\n resolve(\n {\n 'commonImageDataHash': hash(commonImageData.data.toString()).toString(),\n }\n )\n });\n}\n\nfunction generateCanvasImageData(): ImageData {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n return new ImageData(1,1);\n }\n\n // Set canvas dimensions\n canvas.width = _WIDTH;\n canvas.height = _HEIGHT;\n\n // Create rainbow gradient for the background rectangle\n const gradient = ctx.createLinearGradient(0, 0, canvas.width, canvas.height);\n gradient.addColorStop(0, \"red\");\n gradient.addColorStop(1/6, \"orange\");\n gradient.addColorStop(2/6, \"yellow\");\n gradient.addColorStop(3/6, \"green\");\n gradient.addColorStop(4/6, \"blue\");\n gradient.addColorStop(5/6, \"indigo\");\n gradient.addColorStop(1, \"violet\");\n\n // Draw background rectangle with the rainbow gradient\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n // Draw some random text\n const randomText = 'Random Text WMwmil10Oo';\n ctx.font = '23.123px Arial';\n ctx.fillStyle = 'black';\n ctx.fillText(randomText, -5, 15);\n\n // Draw the same text with an offset, different color, and slight transparency\n ctx.fillStyle = 'rgba(0, 0, 255, 0.5)';\n ctx.fillText(randomText, -3.3, 17.7);\n\n // Draw a line crossing the image at an arbitrary angle\n ctx.beginPath();\n ctx.moveTo(0, 0);\n ctx.lineTo(canvas.width * 2/7, canvas.height);\n ctx.strokeStyle = 'white';\n ctx.lineWidth = 2;\n ctx.stroke();\n\n const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n // Return data URL of the canvas\n return imageData;\n}\n\nif (getBrowserName() != 'Firefox')\n includeComponent('canvas', generateCanvasFingerprint);\n\n","export async function ephemeralIFrame(callback: ({ iframe }: { iframe: Document }) => void): Promise<any> {\n\n while (!document.body) {\n await wait(50)\n }\n const iframe = document.createElement('iframe')\n iframe.setAttribute('frameBorder', '0')\n\n const style = iframe.style\n style.setProperty('position','fixed');\n style.setProperty('display', 'block', 'important')\n style.setProperty('visibility', 'visible')\n style.setProperty('border', '0');\n style.setProperty('opacity','0');\n \n iframe.src = 'about:blank'\n document.body.appendChild(iframe)\n \n const iframeDocument = iframe.contentDocument || iframe.contentWindow?.document;\n if (!iframeDocument) {\n throw new Error('Iframe document is not accessible');\n }\n \n // Execute the callback function with access to the iframe's document\n callback({ iframe: iframeDocument });\n \n // Clean up after running the callback\n setTimeout(() => {\n document.body.removeChild(iframe);\n }, 0);\n }\n\n export function wait<T = void>(durationMs: number, resolveWith?: T): Promise<T> {\n return new Promise((resolve) => setTimeout(resolve, durationMs, resolveWith))\n }","import { componentInterface, includeComponent } from '../../factory'\nimport { ephemeralIFrame } from '../../utils/ephemeralIFrame'\nimport { getBrowserName } from '../system/browser'\n\n\n\nconst availableFonts = [\n 'Arial',\n 'Arial Black',\n 'Arial Narrow',\n 'Arial Rounded MT',\n 'Arimo',\n 'Archivo',\n 'Barlow',\n 'Bebas Neue',\n 'Bitter',\n 'Bookman',\n 'Calibri',\n 'Cabin',\n 'Candara',\n 'Century',\n 'Century Gothic',\n 'Comic Sans MS',\n 'Constantia',\n 'Courier',\n 'Courier New',\n 'Crimson Text',\n 'DM Mono',\n 'DM Sans',\n 'DM Serif Display',\n 'DM Serif Text',\n 'Dosis',\n 'Droid Sans',\n 'Exo',\n 'Fira Code',\n 'Fira Sans',\n 'Franklin Gothic Medium',\n 'Garamond',\n 'Geneva',\n 'Georgia',\n 'Gill Sans',\n 'Helvetica',\n 'Impact',\n 'Inconsolata',\n 'Indie Flower',\n 'Inter',\n 'Josefin Sans',\n 'Karla',\n 'Lato',\n 'Lexend',\n 'Lucida Bright',\n 'Lucida Console',\n 'Lucida Sans Unicode',\n 'Manrope',\n 'Merriweather',\n 'Merriweather Sans',\n 'Montserrat',\n 'Myriad',\n 'Noto Sans',\n 'Nunito',\n 'Nunito Sans',\n 'Open Sans',\n 'Optima',\n 'Orbitron',\n 'Oswald',\n 'Pacifico',\n 'Palatino',\n 'Perpetua',\n 'PT Sans',\n 'PT Serif',\n 'Poppins',\n 'Prompt',\n 'Public Sans',\n 'Quicksand',\n 'Rajdhani',\n 'Recursive',\n 'Roboto',\n 'Roboto Condensed',\n 'Rockwell',\n 'Rubik',\n 'Segoe Print',\n 'Segoe Script',\n 'Segoe UI',\n 'Sora',\n 'Source Sans Pro',\n 'Space Mono',\n 'Tahoma',\n 'Taviraj',\n 'Times',\n 'Times New Roman',\n 'Titillium Web',\n 'Trebuchet MS',\n 'Ubuntu',\n 'Varela Round',\n 'Verdana',\n 'Work Sans',\n ];\n\n const baseFonts = ['monospace', 'sans-serif', 'serif'];\n\nexport default function getFontMetrics(): Promise<componentInterface> {\n \n return new Promise((resolve, reject) => {\n try {\n\n ephemeralIFrame(async ({ iframe }) => {\n\n const canvas = iframe.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n const defaultWidths: number[] = baseFonts.map((font) => {\n return measureSingleFont(ctx, font)\n })\n\n let results: {[k: string]: any} = {};\n availableFonts.forEach((font) => {\n const fontWidth = measureSingleFont(ctx, font);\n if (!defaultWidths.includes(fontWidth))\n results[font] = fontWidth;\n });\n \n resolve(results);\n })\n\n\n } catch (error) {\n reject({'error': 'unsupported'})\n }\n });\n};\n\n\nfunction measureSingleFont(ctx: CanvasRenderingContext2D | null, font: string): number {\n if (!ctx) {\n throw new Error('Canvas context not supported');\n }\n const text: string = \"WwMmLli0Oo\";\n ctx.font = `72px ${font}`; // Set a default font size\n return ctx.measureText(text).width;\n}\n\nif (getBrowserName() != 'Firefox')\n includeComponent('fonts', getFontMetrics);","import { componentInterface, includeComponent } from '../../factory'\n\nfunction getHardwareInfo(): Promise<componentInterface> {\n return new Promise((resolve) => {\n const memoryInfo = (window.performance && (window.performance as any).memory ) ? (window.performance as any).memory : 0\n resolve(\n {\n 'videocard': getVideoCard(),\n 'architecture': getArchitecture(),\n 'jsHeapSizeLimit': memoryInfo.jsHeapSizeLimit || 0\n }\n )\n });\n}\n\nfunction getVideoCard(): componentInterface | string {\n const canvas = document.createElement('canvas');\n const gl = canvas.getContext('webgl') ?? canvas.getContext('experimental-webgl');\n \n if (gl && 'getParameter' in gl) {\n try {\n // Try standard parameters first\n const vendor = (gl.getParameter(gl.VENDOR) || '').toString();\n const renderer = (gl.getParameter(gl.RENDERER) || '').toString();\n \n let result: componentInterface = {\n vendor: vendor,\n renderer: renderer,\n version: (gl.getParameter(gl.VERSION) || '').toString(),\n shadingLanguageVersion: (gl.getParameter(gl.SHADING_LANGUAGE_VERSION) || '').toString(),\n };\n \n // Only try debug info if needed and available\n \n const debugInfo = gl.getExtension(\"WEBGL_debug_renderer_info\");\n if (debugInfo) {\n const vendorUnmasked = (gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) || '').toString();\n const rendererUnmasked = (gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) || '').toString();\n \n // Only add unmasked values if they exist\n if (vendorUnmasked) {\n result.vendorUnmasked = vendorUnmasked;\n }\n if (rendererUnmasked) {\n result.rendererUnmasked = rendererUnmasked;\n }\n }\n \n return result;\n } catch (error) {\n // fail silently\n }\n }\n return \"undefined\";\n}\n\nfunction getArchitecture(): number {\n const f = new Float32Array(1);\n const u8 = new Uint8Array(f.buffer);\n f[0] = Infinity;\n f[0] = f[0] - f[0];\n\n return u8[3];\n}\n\nincludeComponent('hardware', getHardwareInfo);","function mostFrequentValue(arr: any[]): any | null {\n if (arr.length === 0) {\n return null; // Return null for an empty array\n }\n \n const frequencyMap: { [key: string]: number } = {};\n \n // Count occurrences of each element in the array\n arr.forEach((element) => {\n const key = String(element);\n frequencyMap[key] = (frequencyMap[key] || 0) + 1;\n });\n \n let mostFrequent: any = arr[0]; // Assume the first element is the most frequent\n let highestFrequency = 1; // Frequency of the assumed most frequent element\n \n // Find the element with the highest frequency\n Object.keys(frequencyMap).forEach((key) => {\n if (frequencyMap[key] > highestFrequency) {\n mostFrequent = key;\n highestFrequency = frequencyMap[key];\n }\n });\n \n return mostFrequent;\n }\n\nexport function mostFrequentValuesInArrayOfDictionaries(arr: { [key: string]: any }[], keys: string[]): { [key: string]: any } {\n const result: { [key: string]: any } = {};\n \n keys.forEach((key) => {\n const valuesForKey = arr.map((obj) => (key in obj ? obj[key] : undefined)).filter((val) => val !== undefined);\n const mostFrequentValueForKey = mostFrequentValue(valuesForKey);\n if (mostFrequentValueForKey)\n result[key] = mostFrequentValueForKey;\n });\n \n return result;\n }","import { componentInterface, includeComponent } from '../../factory';\nimport { mostFrequentValuesInArrayOfDictionaries } from '../../utils/getMostFrequent';\nimport { options } from '../../modules/options';\n\nlet permission_keys: PermissionName[];\nfunction initializePermissionKeys() {\n permission_keys = options?.permissions_to_check || [\n 'accelerometer',\n 'accessibility', 'accessibility-events',\n 'ambient-light-sensor',\n 'background-fetch', \n 'background-sync', \n 'bluetooth',\n 'clipboard-read',\n 'clipboard-write',\n 'device-info', \n 'display-capture',\n 'gyroscope', \n 'local-fonts',\n 'magnetometer', \n 'midi',\n 'nfc', 'notifications',\n 'payment-handler',\n 'persistent-storage',\n 'speaker', 'storage-access',\n 'top-level-storage-access',\n 'window-management',\n 'query',\n ] as PermissionName[];\n}\n\nexport default async function getBrowserPermissions(): Promise<componentInterface> {\n initializePermissionKeys();\n const permissionPromises: Promise<componentInterface>[] = Array.from({length: options?.retries || 3}, () => getBrowserPermissionsOnce() );\n return Promise.all(permissionPromises).then((resolvedPermissions) => {\n const permission = mostFrequentValuesInArrayOfDictionaries(resolvedPermissions, permission_keys);\n return permission;\n });\n}\n\nasync function getBrowserPermissionsOnce(): Promise<componentInterface> {\n\n const permissionStatus: { [key: string]: string } = {};\n\n for (const feature of permission_keys) {\n try {\n // Request permission status for each feature\n const status = await navigator.permissions.query({ name: feature });\n\n // Assign permission status to the object\n permissionStatus[feature] = status.state.toString();\n } catch (error) {\n // In case of errors (unsupported features, etc.), do nothing. Not listing them is the same as not supported\n }\n }\n\n return permissionStatus;\n}\n\nincludeComponent(\"permissions\", getBrowserPermissions);","/*\n * This file contains functions to work with pure data only (no browser features, DOM, side effects, etc).\n */\n\n/**\n * Does the same as Array.prototype.includes but has better typing\n */\nexport function includes<THaystack>(haystack: ArrayLike<THaystack>, needle: unknown): needle is THaystack {\n for (let i = 0, l = haystack.length; i < l; ++i) {\n if (haystack[i] === needle) {\n return true\n }\n }\n return false\n }\n \n /**\n * Like `!includes()` but with proper typing\n */\n export function excludes<THaystack, TNeedle>(\n haystack: ArrayLike<THaystack>,\n needle: TNeedle,\n ): needle is Exclude<TNeedle, THaystack> {\n return !includes(haystack, needle)\n }\n \n /**\n * Be careful, NaN can return\n */\n export function toInt(value: unknown): number {\n return parseInt(value as string)\n }\n \n /**\n * Be careful, NaN can return\n */\n export function toFloat(value: unknown): number {\n return parseFloat(value as string)\n }\n \n export function replaceNaN<T, U>(value: T, replacement: U): T | U {\n return typeof value === 'number' && isNaN(value) ? replacement : value\n }\n \n export function countTruthy(values: unknown[]): number {\n return values.reduce<number>((sum, value) => sum + (value ? 1 : 0), 0)\n }\n \n export function round(value: number, base = 1): number {\n if (Math.abs(base) >= 1) {\n return Math.round(value / base) * base\n } else {\n // Sometimes when a number is multiplied by a small number, precision is lost,\n // for example 1234 * 0.0001 === 0.12340000000000001, and it's more precise divide: 1234 / (1 / 0.0001) === 0.1234.\n const counterBase = 1 / base\n return Math.round(value * counterBase) / counterBase\n }\n }\n \n /**\n * Parses a CSS selector into tag name with HTML attributes.\n * Only single element selector are supported (without operators like space, +, >, etc).\n *\n * Multiple values can be returned for each attribute. You decide how to handle them.\n */\n export function parseSimpleCssSelector(\n selector: string,\n ): [tag: string | undefined, attributes: Record<string, string[]>] {\n const errorMessage = `Unexpected syntax '${selector}'`\n const tagMatch = /^\\s*([a-z-]*)(.*)$/i.exec(selector) as RegExpExecArray\n const tag = tagMatch[1] || undefined\n const attributes: Record<string, string[]> = {}\n const partsRegex = /([.:#][\\w-]+|\\[.+?\\])/gi\n \n const addAttribute = (name: string, value: string) => {\n attributes[name] = attributes[name] || []\n attributes[name].push(value)\n }\n \n for (;;) {\n const match = partsRegex.exec(tagMatch[2])\n if (!match) {\n break\n }\n const part = match[0]\n switch (part[0]) {\n case '.':\n addAttribute('class', part.slice(1))\n break\n case '#':\n addAttribute('id', part.slice(1))\n break\n case '[': {\n const attributeMatch = /^\\[([\\w-]+)([~|^$*]?=(\"(.*?)\"|([\\w-]+)))?(\\s+[is])?\\]$/.exec(part)\n if (attributeMatch) {\n addAttribute(attributeMatch[1], attributeMatch[4] ?? attributeMatch[5] ?? '')\n } else {\n throw new Error(errorMessage)\n }\n break\n }\n default:\n throw new Error(errorMessage)\n }\n }\n \n return [tag, attributes]\n }\n \n export function areSetsEqual(set1: Set<unknown>, set2: Set<unknown>): boolean {\n if (set1 === set2) {\n return true\n }\n if (set1.size !== set2.size) {\n return false\n }\n \n for (let iter = set1.values(), step = iter.next(); !step.done; step = iter.next()) {\n if (!set2.has(step.value)) {\n return false\n }\n }\n return true\n }\n \n export function maxInIterator<T>(iterator: Iterator<T>, getItemScore: (item: T) => number): T | undefined {\n let maxItem: T | undefined\n let maxItemScore: number | undefined\n \n for (let step = iterator.next(); !step.done; step = iterator.next()) {\n const item = step.value\n const score = getItemScore(item)\n if (maxItemScore === undefined || score > maxItemScore) {\n maxItem = item\n maxItemScore = score\n }\n }\n \n return maxItem\n }\n \n /**\n * Converts a string to UTF8 bytes\n */\n export function getUTF8Bytes(input: string): Uint8Array {\n // Benchmark: https://jsbench.me/b6klaaxgwq/1\n // If you want to just count bytes, see solutions at https://jsbench.me/ehklab415e/1\n const result = new Uint8Array(input.length)\n for (let i = 0; i < input.length; i++) {\n // `charCode` is faster than encoding, so we prefer that when it's possible\n const charCode = input.charCodeAt(i)\n \n // In case of non-ASCII symbols we use proper encoding\n if (charCode > 127) {\n return new TextEncoder().encode(input)\n }\n result[i] = charCode\n }\n return result\n }\n ","import { countTruthy } from './data'\nimport { isFunctionNative } from './misc'\n\n/*\n * Functions to help with features that vary through browsers\n */\n\n/**\n * Checks whether the browser is based on Trident (the Internet Explorer engine) without using user-agent.\n *\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nexport function isTrident(): boolean {\n const w = window\n const n = navigator\n\n // The properties are checked to be in IE 10, IE 11 and not to be in other browsers in October 2020\n return (\n countTruthy([\n 'MSCSSMatrix' in w,\n 'msSetImmediate' in w,\n 'msIndexedDB' in w,\n 'msMaxTouchPoints' in n,\n 'msPointerEnabled' in n,\n ]) >= 4\n )\n}\n\n/**\n * Checks whether the browser is based on EdgeHTML (the pre-Chromium Edge engine) without using user-agent.\n *\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nexport function isEdgeHTML(): boolean {\n // Based on research in October 2020\n const w = window\n const n = navigator\n\n return (\n countTruthy(['msWriteProfilerMark' in w, 'MSStream' in w, 'msLaunchUri' in n, 'msSaveBlob' in n]) >= 3 &&\n !isTrident()\n )\n}\n\n/**\n * Checks whether the browser is based on Chromium without using user-agent.\n *\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nexport function isChromium(): boolean {\n // Based on research in October 2020. Tested to detect Chromium 42-86.\n const w = window\n const n = navigator\n\n return (\n countTruthy([\n 'webkitPersistentStorage' in n,\n 'webkitTemporaryStorage' in n,\n (n.vendor || '').indexOf('Google') === 0,\n 'webkitResolveLocalFileSystemURL' in w,\n 'BatteryManager' in w,\n 'webkitMediaStream' in w,\n 'webkitSpeechGrammar' in w,\n ]) >= 5\n )\n}\n\n/**\n * Checks whether the browser is based on mobile or desktop Safari without using user-agent.\n * All iOS browsers use WebKit (the Safari engine).\n *\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nexport function isWebKit(): boolean {\n // Based on research in August 2024\n const w = window\n const n = navigator\n\n return (\n countTruthy([\n 'ApplePayError' in w,\n 'CSSPrimitiveValue' in w,\n 'Counter' in w,\n n.vendor.indexOf('Apple') === 0,\n 'RGBColor' in w,\n 'WebKitMediaKeys' in w,\n ]) >= 4\n )\n}\n\n/**\n * Checks whether this WebKit browser is a desktop browser.\n * It doesn't check that the browser is based on WebKit, there is a separate function for this.\n *\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nexport function isDesktopWebKit(): boolean {\n // Checked in Safari and DuckDuckGo\n\n const w = window\n const { HTMLElement, Document } = w\n\n return (\n countTruthy([\n 'safari' in w, // Always false in Karma and BrowserStack Automate\n !('ongestureend' in w),\n !('TouchEvent' in w),\n !('orientation' in w),\n HTMLElement && !('autocapitalize' in HTMLElement.prototype),\n Document && 'pointerLockElement' in Document.prototype,\n ]) >= 4\n )\n}\n\n/**\n * Checks whether this WebKit browser is Safari.\n * It doesn't check that the browser is based on WebKit, there is a separate function for this.\n *\n * Warning! The function works properly only for Safari version 15.4 and newer.\n */\nexport function isSafariWebKit(): boolean {\n // Checked in Safari, Chrome, Firefox, Yandex, UC Browser, Opera, Edge and DuckDuckGo.\n // iOS Safari and Chrome were checked on iOS 11-18. DuckDuckGo was checked on iOS 17-18 and macOS 14-15.\n // Desktop Safari versions 12-18 were checked.\n // The other browsers were checked on iOS 17 and 18; there was no chance to check them on the other OS versions.\n\n const w = window\n\n return (\n // Filters-out Chrome, Yandex, DuckDuckGo (macOS and iOS), Edge\n isFunctionNative(w.print) &&\n // Doesn't work in Safari < 15.4\n String((w as unknown as Record<string, unknown>).browser) === '[object WebPageNamespace]'\n )\n}\n\n/**\n * Checks whether the browser is based on Gecko (Firefox engine) without using user-agent.\n *\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nexport function isGecko(): boolean {\n const w = window\n\n // Based on research in September 2020\n return (\n countTruthy([\n 'buildID' in navigator,\n 'MozAppearance' in (document.documentElement?.style ?? {}),\n 'onmozfullscreenchange' in w,\n 'mozInnerScreenX' in w,\n 'CSSMozDocumentRule' in w,\n 'CanvasCaptureMediaStream' in w,\n ]) >= 4\n )\n}\n\n/**\n * Checks whether the browser is based on Chromium version ≥86 without using user-agent.\n * It doesn't check that the browser is based on Chromium, there is a separate function for this.\n */\nexport function isChromium86OrNewer(): boolean {\n // Checked in Chrome 85 vs Chrome 86 both on desktop and Android. Checked in macOS Chrome 128, Android Chrome 127.\n const w = window\n\n return (\n countTruthy([\n !('MediaSettingsRange' in w),\n 'RTCEncodedAudioFrame' in w,\n '' + w.Intl === '[object Intl]',\n '' + w.Reflect === '[object Reflect]',\n ]) >= 3\n )\n}\n\n/**\n * Checks whether the browser is based on Chromium version ≥122 without using user-agent.\n * It doesn't check that the browser is based on Chromium, there is a separate function for this.\n */\nexport function isChromium122OrNewer(): boolean {\n // Checked in Chrome 121 vs Chrome 122 and 129 both on desktop and Android\n const w: any = window\n const { URLPattern } = w\n\n return (\n countTruthy([\n 'union' in Set.prototype,\n 'Iterator' in w,\n URLPattern && 'hasRegExpGroups' in URLPattern.prototype,\n 'RGB8' in WebGLRenderingContext.prototype,\n ]) >= 3\n )\n}\n\n/**\n * Checks whether the browser is based on WebKit version ≥606 (Safari ≥12) without using user-agent.\n * It doesn't check that the browser is based on WebKit, there is a separate function for this.\n *\n * @see https://en.wikipedia.org/wiki/Safari_version_history#Release_history Safari-WebKit versions map\n */\nexport function isWebKit606OrNewer(): boolean {\n // Checked in Safari 9–18\n const w = window\n\n return (\n countTruthy([\n 'DOMRectList' in w,\n 'RTCPeerConnectionIceEvent' in w,\n 'SVGGeometryElement' in w,\n 'ontransitioncancel' in w,\n ]) >= 3\n )\n}\n\n/**\n * Checks whether the browser is based on WebKit version ≥616 (Safari ≥17) without using user-agent.\n * It doesn't check that the browser is based on WebKit, there is a separate function for this.\n *\n * @see https://developer.apple.com/documentation/safari-release-notes/safari-17-release-notes Safari 17 release notes\n * @see https://tauri.app/v1/references/webview-versions/#webkit-versions-in-safari Safari-WebKit versions map\n */\nexport function isWebKit616OrNewer(): boolean {\n const w = window\n const n = navigator\n const { CSS, HTMLButtonElement } = w\n\n return (\n countTruthy([\n !('getStorageUpdates' in n),\n HTMLButtonElement && 'popover' in HTMLButtonElement.prototype,\n 'CSSCounterStyleRule' in w,\n CSS.supports('font-size-adjust: ex-height 0.5'),\n CSS.supports('text-transform: full-width'),\n ]) >= 4\n )\n}\n\n/**\n * Checks whether the device is an iPad.\n * It doesn't check that the engine is WebKit and that the WebKit isn't desktop.\n */\nexport function isIPad(): boolean {\n // Checked on:\n // Safari on iPadOS (both mobile and desktop modes): 8, 11-18\n // Chrome on iPadOS (both mobile and desktop modes): 11-18\n // Safari on iOS (both mobile and desktop modes): 9-18\n // Chrome on iOS (both mobile and desktop modes): 9-18\n\n // Before iOS 13. Safari tampers the value in \"request desktop site\" mode since iOS 13.\n if (navigator.platform === 'iPad') {\n return true\n }\n\n const s = screen\n const screenRatio = s.width / s.height\n\n return (\n countTruthy([\n // Since iOS 13. Doesn't work in Chrome on iPadOS <15, but works in desktop mode.\n 'MediaSource' in window,\n // Since iOS 12. Doesn't work in Chrome on iPadOS.\n !!(Element as any).prototype.webkitRequestFullscreen,\n // iPhone 4S that runs iOS 9 matches this, but it is not supported\n // Doesn't work in incognito mode of Safari ≥17 with split screen because of tracking prevention\n screenRatio > 0.65 && screenRatio < 1.53,\n ]) >= 2\n )\n}\n\n/**\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nexport function getFullscreenElement(): Element | null {\n const d: any = document\n return d.fullscreenElement || d.msFullscreenElement || d.mozFullScreenElement || d.webkitFullscreenElement || null\n}\n\nexport function exitFullscreen(): Promise<void> {\n const d: any = document\n // `call` is required because the function throws an error without a proper \"this\" context\n return (d.exitFullscreen || d.msExitFullscreen || d.mozCancelFullScreen || d.webkitExitFullscreen).call(d)\n}\n\n/**\n * Checks whether the device runs on Android without using user-agent.\n *\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nexport function isAndroid(): boolean {\n const isItChromium = isChromium()\n const isItGecko = isGecko()\n const w = window\n const n = navigator\n // Chrome removes all words \"Android\" from `navigator` when desktop version is requested\n // Firefox keeps \"Android\" in `navigator.appVersion` when desktop version is requested\n if (isItChromium) {\n return (\n countTruthy([\n !('SharedWorker' in w),\n // `typechange` is deprecated, but it's still present on Android (tested on Chrome Mobile 117)\n // Removal proposal https://bugs.chromium.org/p/chromium/issues/detail?id=699892\n // Note: this expression returns true on ChromeOS, so additional detectors are required to avoid false-positives\n // n[c] && 'ontypechange' in n[c],\n !('sinkId' in new Audio()),\n ]) >= 2\n )\n } else if (isItGecko) {\n return countTruthy(['onorientationchange' in w, 'orientation' in w, /android/i.test(n.appVersion)]) >= 2\n } else {\n // Only 2 browser engines are presented on Android.\n // Actually, there is also Android 4.1 browser, but it's not worth detecting it at the moment.\n return false\n }\n}\n\n/**\n * Checks whether the browser is Samsung Internet without using user-agent.\n * It doesn't check that the browser is based on Chromium, please use `isChromium` before using this function.\n *\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nexport function isSamsungInternet(): boolean {\n // Checked in Samsung Internet 21, 25 and 27\n const n = navigator\n const w = window\n const audioPrototype = Audio.prototype\n const { visualViewport } = w\n\n return (\n countTruthy([\n 'srLatency' in audioPrototype,\n 'srChannelCount' in audioPrototype,\n 'devicePosture' in n, // Not available in HTTP\n visualViewport && 'segments' in visualViewport,\n 'getTextInformation' in Image.prototype, // Not available in Samsung Internet 21\n ]) >= 3\n )\n}\n","/**\n * Converts an error object to a plain object that can be used with `JSON.stringify`.\n * If you just run `JSON.stringify(error)`, you'll get `'{}'`.\n */\nexport function errorToObject(error: Readonly<Error>): Record<string, unknown> {\n return {\n name: error.name,\n message: error.message,\n stack: error.stack?.split('\\n'),\n // The fields are not enumerable, so TS is wrong saying that they will be overridden\n ...(error as Omit<Error, 'name' | 'message'>),\n }\n }\n \n export function isFunctionNative(func: (...args: unknown[]) => unknown): boolean {\n return /^function\\s.*?\\{\\s*\\[native code]\\s*}$/.test(String(func))\n }\n ","import { componentInterface, includeComponent } from '../../factory'\n\nfunction getLocales(): Promise<componentInterface> {\n return new Promise((resolve) => {\n resolve(\n {\n 'languages': getUserLanguage(),\n 'timezone': getUserTimezone()\n });\n });\n}\n\nfunction getUserLanguage(): string {\n return navigator.language;\n}\n\nfunction getUserTimezone(): string {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n}\n\nincludeComponent('locales', getLocales);","import { componentInterface, includeComponent } from '../../factory';\n\nfunction screenDetails(): Promise<componentInterface> {\n return new Promise((resolve) => {\n resolve(\n {\n 'colorDepth': screen.colorDepth,\n }\n );\n });\n}\n\nincludeComponent('screen', screenDetails);","import { includeComponent } from \"../../factory\";\nimport {\n isSafariWebKit,\n isWebKit,\n isWebKit616OrNewer,\n} from \"../../utils/browser_\";\nimport { replaceNaN, toInt } from \"../../utils/data\";\n\ntype ScreenResolution = [number | null, number | null];\n\n/**\n * A version of the entropy source with stabilization to make it suitable for static fingerprinting.\n * The window resolution is always the document size in private mode of Safari 17,\n * so the window resolution is not used in Safari 17.\n */\nexport default async function getScreenResolution(): Promise<any> {\n if (isWebKit() && isWebKit616OrNewer() && isSafariWebKit()) {\n return [];\n }\n\n return getUnstableScreenResolution();\n}\n\n/**\n * A version of the entropy source without stabilization.\n *\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nexport function getUnstableScreenResolution(): ScreenResolution {\n const s = screen;\n\n // Some browsers return screen resolution as strings, e.g. \"1200\", instead of a number, e.g. 1200.\n // I suspect it's done by certain plugins that randomize browser properties to prevent fingerprinting.\n // Some browsers even return screen resolution as not numbers.\n const parseDimension = (value: unknown) => replaceNaN(toInt(value), null);\n const dimensions = [\n parseDimension(s.width),\n parseDimension(s.height),\n ] as ScreenResolution;\n dimensions.sort().reverse();\n return dimensions;\n}\n\nincludeComponent(\"screenResolution\", getScreenResolution);\n","import { componentInterface, } from '../../factory'\nimport { hash } from '../../utils/hash'\nimport { getCommonPixels } from '../../utils/commonPixels';\nimport { getBrowser } from '../system/browser';\n\nconst _RUNS = (getBrowser().name !== 'SamsungBrowser') ? 1 : 3;\nlet canvas: HTMLCanvasElement\nlet gl: WebGLRenderingContext | null = null;\n\nfunction initializeCanvasAndWebGL() {\n if (typeof document !== 'undefined') {\n canvas = document.createElement('canvas');\n canvas.width = 200;\n canvas.height = 100;\n gl = canvas.getContext('webgl');\n }\n}\n\nexport async function createWebGLFingerprint(): Promise<componentInterface | undefined> {\n initializeCanvasAndWebGL();\n \n try {\n\n if (!gl) {\n throw new Error('WebGL not supported');\n }\n\n\n const imageDatas: ImageData[] = Array.from({length: _RUNS}, () => createWebGLImageData() );\n // and then checking the most common bytes for each channel of each pixel\n const commonImageData = getCommonPixels(imageDatas, canvas.width, canvas.height);\n //const imageData = createWebGLImageData()\n\n return {\n 'commonImageHash': hash(commonImageData.data.toString()).toString(),\n }\n } catch (error) {\n return \n }\n}\n\nfunction createWebGLImageData(): ImageData {\n try {\n\n if (!gl) {\n throw new Error('WebGL not supported');\n }\n\n const vertexShaderSource = `\n attribute vec2 position;\n void main() {\n gl_Position = vec4(position, 0.0, 1.0);\n }\n `;\n\n const fragmentShaderSource = `\n precision mediump float;\n void main() {\n gl_FragColor = vec4(0.812, 0.195, 0.553, 0.921); // Set line color\n }\n `;\n\n const vertexShader = gl.createShader(gl.VERTEX_SHADER);\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n\n if (!vertexShader || !fragmentShader) {\n throw new Error('Failed to create shaders');\n }\n\n gl.shaderSource(vertexShader, vertexShaderSource);\n gl.shaderSource(fragmentShader, fragmentShaderSource);\n\n gl.compileShader(vertexShader);\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n throw new Error('Vertex shader compilation failed: ' + gl.getShaderInfoLog(vertexShader));\n }\n\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n throw new Error('Fragment shader compilation failed: ' + gl.getShaderInfoLog(fragmentShader));\n }\n\n const shaderProgram = gl.createProgram();\n\n if (!shaderProgram) {\n throw new Error('Failed to create shader program');\n }\n\n gl.attachShader(shaderProgram, vertexShader);\n gl.attachShader(shaderProgram, fragmentShader);\n gl.linkProgram(shaderProgram);\n if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {\n throw new Error('Shader program linking failed: ' + gl.getProgramInfoLog(shaderProgram));\n }\n\n gl.useProgram(shaderProgram);\n\n // Set up vertices to form lines\n const numSpokes: number = 137;\n const vertices = new Float32Array(numSpokes * 4);\n const angleIncrement = (2 * Math.PI) / numSpokes;\n\n for (let i = 0; i < numSpokes; i++) {\n const angle = i * angleIncrement;\n\n // Define two points for each line (spoke)\n vertices[i * 4] = 0; // Center X\n vertices[i * 4 + 1] = 0; // Center Y\n vertices[i * 4 + 2] = Math.cos(angle) * (canvas.width / 2); // Endpoint X\n vertices[i * 4 + 3] = Math.sin(angle) * (canvas.height / 2); // Endpoint Y\n }\n\n const vertexBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n\n const positionAttribute = gl.getAttribLocation(shaderProgram, 'position');\n gl.enableVertexAttribArray(positionAttribute);\n gl.vertexAttribPointer(positionAttribute, 2, gl.FLOAT, false, 0, 0);\n\n // Render\n gl.viewport(0, 0, canvas.width, canvas.height);\n gl.clearColor(0.0, 0.0, 0.0, 1.0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.drawArrays(gl.LINES, 0, numSpokes * 2);\n\n const pixelData = new Uint8ClampedArray(canvas.width * canvas.height * 4);\n gl.readPixels(0, 0, canvas.width, canvas.height, gl.RGBA, gl.UNSIGNED_BYTE, pixelData);\n const imageData = new ImageData(pixelData, canvas.width, canvas.height);\n\n return imageData;\n } catch (error) {\n //console.error(error);\n return new ImageData(1, 1);\n } finally {\n if (gl) {\n // Reset WebGL state\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n gl.useProgram(null);\n gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n gl.clearColor(0.0, 0.0, 0.0, 0.0);\n }\n }\n}\n","import { componentInterface, includeComponent } from '../../factory';\nimport { detectBrowser } from './browser'\n\nasync function getSystemDetails(): Promise<componentInterface> {\n return new Promise((resolve) => {\n // Get detailed browser information\n const browserDetails = detectBrowser();\n \n resolve({\n 'platform': window.navigator.platform,\n 'cookieEnabled': window.navigator.cookieEnabled,\n 'productSub': navigator.productSub,\n 'product': navigator.product,\n 'browser': {\n 'name': browserDetails.name,\n },\n 'applePayVersion': getApplePayVersion(),\n });\n });\n}\n\n/**\n * Generates a unique browser hash based on various browser characteristics\n * that can be used for fingerprinting\n */\n// function generateBrowserHash(): string {\n// const characteristics = [\n// navigator.userAgent,\n// navigator.language,\n// navigator.hardwareConcurrency,\n// navigator.deviceMemory,\n// navigator.platform,\n// screen.colorDepth,\n// navigator.maxTouchPoints,\n// 'chrome' in window ? 'chrome' : 'no-chrome',\n// 'opr' in window ? 'opera' : 'no-opera',\n// 'safari' in window ? 'safari' : 'no-safari',\n// new Date().getTimezoneOffset(),\n// screen.width + 'x' + screen.height\n// ];\n \n// // Use simple hashing algorithm\n// let hash = 0;\n// const str = characteristics.join('||');\n \n// for (let i = 0; i < str.length; i++) {\n// const char = str.charCodeAt(i);\n// hash = ((hash << 5) - hash) + char;\n// hash = hash & hash; // Convert to 32bit integer\n// }\n\n// // Convert to hex string\n// return (hash >>> 0).toString(16).padStart(8, '0');\n// }\n\n/**\n * @returns applePayCanMakePayments: boolean, applePayMaxSupportedVersion: number\n */\nfunction getApplePayVersion(): number {\n if (window.location.protocol === 'https:' && typeof (window as any).ApplePaySession === 'function') {\n try {\n const versionCheck = (window as any).ApplePaySession.supportsVersion;\n for (let i = 15; i > 0; i--) {\n if (versionCheck(i)) {\n return i;\n }\n }\n } catch (error) {\n return 0\n }\n }\n return 0\n}\n\nincludeComponent('system', getSystemDetails);\n\n","import { componentInterface, includeComponent } from \"../../factory\";\nimport { isChromium, isGecko, isWebKit } from \"../../utils/browser_\";\nimport { createWebGLFingerprint } from \"./imageHash\";\n\n// Types and constants are used instead of interfaces and enums to avoid this error in projects which use this library:\n// Exported variable '...' has or is using name '...' from external module \"...\" but cannot be named.\n\n\n/**\n * WebGL extended features\n */\ntype WebGlExtensionsPayload = {\n contextAttributes: string[]; // ['alpha=true', 'antialias=true...\n parameters: string[]; // ['ACTIVE_TEXTURE(33984)', 'ALIASED_LINE_WID...\n shaderPrecisions: string[]; // ['FRAGMENT_SHADER.LOW_FLOAT=127,127,23...\n extensions: string[] | null; // ['ANGLE_instanced_arrays', 'EXT_blend_minmax', 'EXT_color...\n extensionParameters: string[]; // ['COMPRESSED_RGB_S3TC_DXT1_EXT(33776)', 'COMPR...\n unsupportedExtensions: string[]; // ['EXT_blend_minmax', 'EXT_color...\n};\n\ntype CanvasContext = WebGLRenderingContext & {\n readonly canvas: HTMLCanvasElement;\n};\n\ntype Options = {\n cache: {\n webgl?: {\n context: CanvasContext | undefined;\n };\n };\n};\n\n/** WebGl context is not available */\nexport const STATUS_NO_GL_CONTEXT = -1;\n/** WebGL context `getParameter` method is not a function */\nexport const STATUS_GET_PARAMETER_NOT_A_FUNCTION = -2;\n\nexport type SpecialStatus =\n | typeof STATUS_NO_GL_CONTEXT\n | typeof STATUS_GET_PARAMETER_NOT_A_FUNCTION;\n\nconst validContextParameters = new Set([\n 10752, 2849, 2884, 2885, 2886, 2928, 2929, 2930, 2931, 2932, 2960, 2961, 2962,\n 2963, 2964, 2965, 2966, 2967, 2968, 2978, 3024, 3042, 3088, 3089, 3106, 3107,\n 32773, 32777, 32777, 32823, 32824, 32936, 32937, 32938, 32939, 32968, 32969,\n 32970, 32971, 3317, 33170, 3333, 3379, 3386, 33901, 33902, 34016, 34024,\n 34076, 3408, 3410, 3411, 3412, 3413, 3414, 3415, 34467, 34816, 34817, 34818,\n 34819, 34877, 34921, 34930, 35660, 35661, 35724, 35738, 35739, 36003, 36004,\n 36005, 36347, 36348, 36349, 37440, 37441, 37443, 7936, 7937, 7938,\n // SAMPLE_ALPHA_TO_COVERAGE (32926) and SAMPLE_COVERAGE (32928) are excluded because they trigger a console warning\n // in IE, Chrome ≤ 59 and Safari ≤ 13 and give no entropy.\n]);\nconst validExtensionParams = new Set([\n 34047, // MAX_TEXTURE_MAX_ANISOTROPY_EXT\n 35723, // FRAGMENT_SHADER_DERIVATIVE_HINT_OES\n 36063, // MAX_COLOR_ATTACHMENTS_WEBGL\n 34852, // MAX_DRAW_BUFFERS_WEBGL\n 34853, // DRAW_BUFFER0_WEBGL\n 34854, // DRAW_BUFFER1_WEBGL\n 34229, // VERTEX_ARRAY_BINDING_OES\n 36392, // TIMESTAMP_EXT\n 36795, // GPU_DISJOINT_EXT\n 38449, // MAX_VIEWS_OVR\n]);\nconst shaderTypes = [\"FRAGMENT_SHADER\", \"VERTEX_SHADER\"] as const;\nconst precisionTypes = [\n \"LOW_FLOAT\",\n \"MEDIUM_FLOAT\",\n \"HIGH_FLOAT\",\n \"LOW_INT\",\n \"MEDIUM_INT\",\n \"HIGH_INT\",\n] as const;\nconst rendererInfoExtensionName = \"WEBGL_debug_renderer_info\";\nconst polygonModeExtensionName = \"WEBGL_polygon_mode\";\n\n/**\n * Gets the basic and simple WebGL parameters\n */\nexport async function getWebGlBasics(\n { cache = {} }: Options = { cache: {} }\n): Promise<componentInterface> {\n const gl = getWebGLContext(cache);\n if (!gl) {\n return { status: STATUS_NO_GL_CONTEXT };\n }\n\n if (!isValidParameterGetter(gl)) {\n return { status: STATUS_GET_PARAMETER_NOT_A_FUNCTION };\n }\n\n const debugExtension = shouldAvoidDebugRendererInfo()\n ? null\n : gl.getExtension(rendererInfoExtensionName);\n\n const imageHash = await createWebGLFingerprint();\n\n return {\n version: gl.getParameter(gl.VERSION)?.toString() || \"\",\n vendor: gl.getParameter(gl.VENDOR)?.toString() || \"\",\n vendorUnmasked: debugExtension\n ? gl.getParameter(debugExtension.UNMASKED_VENDOR_WEBGL)?.toString()\n : \"\",\n renderer: gl.getParameter(gl.RENDERER)?.toString() || \"\",\n rendererUnmasked: debugExtension\n ? gl.getParameter(debugExtension.UNMASKED_RENDERER_WEBGL)?.toString()\n : \"\",\n shadingLanguageVersion:\n gl.getParameter(gl.SHADING_LANGUAGE_VERSION)?.toString() || \"\",\n ...imageHash,\n };\n}\n\n/**\n * Gets the advanced and massive WebGL parameters and extensions\n */\nexport async function getWebGlExtensions(\n { cache = {} }: Options = { cache: {} }\n): Promise<WebGlExtensionsPayload | SpecialStatus> {\n const gl = getWebGLContext(cache);\n if (!gl) {\n return STATUS_NO_GL_CONTEXT;\n }\n\n if (!isValidParameterGetter(gl)) {\n return STATUS_GET_PARAMETER_NOT_A_FUNCTION;\n }\n\n const extensions = gl.getSupportedExtensions();\n const contextAttributes = gl.getContextAttributes();\n const unsupportedExtensions: string[] = [];\n\n // Features\n const attributes: string[] = [];\n const parameters: string[] = [];\n const extensionParameters: string[] = [];\n const shaderPrecisions: string[] = [];\n\n // Context attributes\n if (contextAttributes) {\n for (const attributeName of Object.keys(\n contextAttributes\n ) as (keyof WebGLContextAttributes)[]) {\n attributes.push(`${attributeName}=${contextAttributes[attributeName]}`);\n }\n }\n\n // Context parameters\n const constants = getConstantsFromPrototype(gl);\n for (const constant of constants) {\n const code = gl[constant] as number;\n parameters.push(\n `${constant}=${code}${\n validContextParameters.has(code) ? `=${gl.getParameter(code)}` : \"\"\n }`\n );\n }\n\n // Extension parameters\n if (extensions) {\n for (const name of extensions) {\n if (\n (name === rendererInfoExtensionName &&\n shouldAvoidDebugRendererInfo()) ||\n (name === polygonModeExtensionName &&\n shouldAvoidPolygonModeExtensions())\n ) {\n continue;\n }\n\n const extension = gl.getExtension(name);\n if (!extension) {\n unsupportedExtensions.push(name);\n continue;\n }\n\n for (const constant of getConstantsFromPrototype(extension)) {\n const code = extension[constant];\n extensionParameters.push(\n `${constant}=${code}${\n validExtensionParams.has(code) ? `=${gl.getParameter(code)}` : \"\"\n }`\n );\n }\n }\n }\n\n // Shader precision\n for (const shaderType of shaderTypes) {\n for (const precisionType of precisionTypes) {\n const shaderPrecision = getShaderPrecision(gl, shaderType, precisionType);\n shaderPrecisions.push(\n `${shaderType}.${precisionType}=${shaderPrecision.join(\",\")}`\n );\n }\n }\n\n // Postprocess\n extensionParameters.sort();\n parameters.sort();\n\n return {\n contextAttributes: attributes,\n parameters: parameters,\n shaderPrecisions: shaderPrecisions,\n extensions: extensions,\n extensionParameters: extensionParameters,\n unsupportedExtensions,\n };\n}\n\n/**\n * This function usually takes the most time to execute in all the sources, therefore we cache its result.\n *\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nexport function getWebGLContext(cache: Options[\"cache\"]) {\n if (cache.webgl) {\n return cache.webgl.context;\n }\n\n const canvas = document.createElement(\"canvas\");\n let context: CanvasContext | undefined;\n\n canvas.addEventListener(\n \"webglCreateContextError\",\n () => (context = undefined)\n );\n\n for (const type of [\"webgl\", \"experimental-webgl\"]) {\n try {\n context = canvas.getContext(type) as CanvasContext;\n } catch {\n // Ok, continue\n }\n if (context) {\n break;\n }\n }\n\n cache.webgl = { context };\n return context;\n}\n\n/**\n * https://developer.mozilla.org/en-US/docs/Web/API/WebGLShaderPrecisionFormat\n * https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getShaderPrecisionFormat\n * https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.12\n */\nfunction getShaderPrecision(\n gl: WebGLRenderingContext,\n shaderType: (typeof shaderTypes)[number],\n precisionType: (typeof precisionTypes)[number]\n) {\n const shaderPrecision = gl.getShaderPrecisionFormat(\n gl[shaderType],\n gl[precisionType]\n );\n return shaderPrecision\n ? [\n shaderPrecision.rangeMin,\n shaderPrecision.rangeMax,\n shaderPrecision.precision,\n ]\n : [];\n}\n\nfunction getConstantsFromPrototype<K>(obj: K): Array<Extract<keyof K, string>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const keys = Object.keys((obj as any).__proto__) as Array<keyof K>;\n return keys.filter(isConstantLike);\n}\n\nfunction isConstantLike<K>(key: K): key is Extract<K, string> {\n return typeof key === \"string\" && !key.match(/[^A-Z0-9_x]/);\n}\n\n/**\n * Some browsers print a console warning when the WEBGL_debug_renderer_info extension is requested.\n * JS Agent aims to avoid printing messages to console, so we avoid this extension in that browsers.\n */\nexport function shouldAvoidDebugRendererInfo(): boolean {\n return isGecko();\n}\n\n/**\n * Some browsers print a console warning when the WEBGL_polygon_mode extension is requested.\n * JS Agent aims to avoid printing messages to console, so we avoid this extension in that browsers.\n */\nexport function shouldAvoidPolygonModeExtensions(): boolean {\n return isChromium() || isWebKit();\n}\n\n/**\n * Some unknown browsers have no `getParameter` method\n */\nfunction isValidParameterGetter(gl: WebGLRenderingContext) {\n return typeof gl.getParameter === \"function\";\n}\n\nincludeComponent(\"webgl\", getWebGlBasics);\n","import { componentInterface, includeComponent } from '../../factory'\n\nexport default function getInstalledPlugins(): Promise<componentInterface> {\n const plugins: string[] = [];\n \n if (navigator.plugins) {\n for (let i = 0; i < navigator.plugins.length; i++) {\n const plugin = navigator.plugins[i];\n plugins.push([plugin.name, plugin.filename, plugin.description ].join(\"|\"));\n }\n }\n \n return new Promise((resolve) => {\n resolve(\n {\n 'plugins': plugins\n }\n );\n });\n }\n \n includeComponent('plugins', getInstalledPlugins);","import { componentInterface, includeComponent } from '../../factory';\nimport { hash } from '../../utils/hash';\n\n/**\n * Set of emojis to sample for fingerprinting\n * These emojis are chosen because they have significant rendering differences across platforms\n */\nconst TEST_EMOJIS = [\n '😀', // Basic smiling face - varies significantly\n '👨‍👩‍👧‍👦', // Family emoji - complex with multiple characters\n '🇺🇸', // Flag - rendered differently across platforms\n '🍎', // Apple - varies in color and style\n '🐼', // Panda - good variation in details\n '🚀', // Rocket - complex shape with details\n '🏳️‍🌈', // Rainbow flag - combination character\n '👍🏽', // Thumbs up with skin tone - tests skin tone rendering\n '❤️', // Heart with variation selector\n '🤦‍♂️', // Facepalm with gender - complex combination\n];\n\n/**\n * Font families to test for emoji rendering variations\n */\nconst TEST_FONTS = [\n 'Apple Color Emoji',\n 'Segoe UI Emoji',\n 'Segoe UI Symbol',\n 'Noto Color Emoji',\n 'Android Emoji',\n 'EmojiOne',\n 'Twemoji Mozilla',\n 'sans-serif' // Fallback\n];\n\n/**\n * Renders an emoji to a canvas and returns its pixel data\n * @param emoji The emoji to render\n * @param fontFamily Font family to use\n * @returns Uint8ClampedArray of pixels or null if rendering fails\n */\nfunction renderEmojiToCanvas(emoji: string, fontFamily: string): Uint8ClampedArray | null {\n try {\n // Create canvas and context\n const canvas = document.createElement('canvas');\n const size = 20; // Small size is enough for fingerprinting\n canvas.width = size;\n canvas.height = size;\n \n const ctx = canvas.getContext('2d');\n if (!ctx) return null;\n \n // Clear background\n ctx.fillStyle = 'white';\n ctx.fillRect(0, 0, size, size);\n \n // Draw emoji\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n ctx.fillStyle = 'black';\n ctx.font = `16px \"${fontFamily}\"`;\n ctx.fillText(emoji, size / 2, size / 2);\n \n // Get pixel data\n return ctx.getImageData(0, 0, size, size).data;\n } catch (e) {\n return null;\n }\n}\n\n/**\n * Creates a simplified fingerprint from pixel data by sampling\n * @param pixels Canvas pixel data\n * @returns Simplified representation for fingerprinting\n */\nfunction simplifyPixelData(pixels: Uint8ClampedArray): number[] {\n // Sample every 8th pixel for efficiency\n const simplified: number[] = [];\n \n for (let i = 0; i < pixels.length; i += 32) {\n // Use only RGB values (skip alpha)\n simplified.push(pixels[i], pixels[i + 1], pixels[i + 2]);\n }\n \n return simplified;\n}\n\n/**\n * Generates a fingerprint based on emoji rendering\n * @returns Promise that resolves to emoji fingerprint data\n */\nasync function getEmojiFingerprint(): Promise<componentInterface> {\n return new Promise((resolve) => {\n try {\n const results: Record<string, string> = {};\n let combinedData: number[] = [];\n \n // Test each emoji with the first available font\n TEST_EMOJIS.forEach((emoji, index) => {\n // Try each font until one works\n for (const font of TEST_FONTS) {\n const pixelData = renderEmojiToCanvas(emoji, font);\n \n if (pixelData) {\n const simplified = simplifyPixelData(pixelData);\n combinedData = [...combinedData, ...simplified];\n \n // Store individual emoji hash for detailed fingerprinting\n results[`emoji_${index}`] = hash(new Uint8Array(simplified).buffer).slice(0, 16);\n break; // Use first successful font\n }\n }\n });\n \n // Generate a combined hash for all emoji data\n const combinedHash = hash(new Uint8Array(combinedData).buffer);\n \n resolve({\n emojiFingerprintHash: combinedHash,\n emojiDetails: results,\n uniqueEmojisRendered: Object.keys(results).length\n });\n } catch (e) {\n // Fallback in case of any errors\n resolve({\n emojiFingerprintHash: 'unsupported',\n emojiDetails: {},\n uniqueEmojisRendered: 0\n });\n }\n });\n}\n\n// Register the component\nincludeComponent('emojiFingerprint', getEmojiFingerprint); ","import { componentInterface, includeComponent } from '../../factory'\n\nconst getMathInfo = async (): Promise<componentInterface> => {\n return {\n acos: Math.acos(0.5),\n asin: integrate(Math.asin, -1, 1, 97),\n atan: integrate(Math.atan, -1, 1, 97),\n cos: integrate(Math.cos, 0, Math.PI, 97),\n cosh: Math.cosh(9/7),\n e: Math.E,\n largeCos: Math.cos(1e20),\n largeSin: Math.sin(1e20),\n largeTan: Math.tan(1e20),\n log: Math.log(1000),\n pi: Math.PI,\n sin: integrate(Math.sin, -Math.PI, Math.PI, 97),\n sinh: integrate(Math.sinh, -9/7, 7/9, 97),\n sqrt: Math.sqrt(2),\n tan: integrate(Math.tan, 0, 2 * Math.PI, 97),\n tanh: integrate(Math.tanh, -9/7, 7/9, 97),\n }\n}\n\n/** This might be a little excessive, but I wasn't sure what number to pick for some of the\n * trigonometric functions. Using an integral here, so a few numbers are calculated. However,\n * I do this mainly for those integrals that sum up to a small value, otherwise there's no point.\n*/ \n\nconst integrate = (f: (x: number) => number, a: number, b: number, n: number): number => {\n const h = (b - a) / n;\n let sum = 0;\n for (let i = 0; i < n; i++) {\n const x = a + (i + 0.5) * h;\n sum += f(x);\n }\n return sum * h;\n};\n\nincludeComponent('math', getMathInfo);","export type MaybePromise<T> = Promise<T> | T\n\nexport function wait<T = void>(durationMs: number, resolveWith?: T): Promise<T> {\n return new Promise((resolve) => setTimeout(resolve, durationMs, resolveWith))\n}\n\n/**\n * Allows asynchronous actions and microtasks to happen.\n */\nfunction releaseEventLoop(): Promise<void> {\n // Don't use setTimeout because Chrome throttles it in some cases causing very long agent execution:\n // https://stackoverflow.com/a/6032591/1118709\n // https://github.com/chromium/chromium/commit/0295dd09496330f3a9103ef7e543fa9b6050409b\n // Reusing a MessageChannel object gives no noticeable benefits\n return new Promise((resolve) => {\n const channel = new MessageChannel()\n channel.port1.onmessage = () => resolve()\n channel.port2.postMessage(null)\n })\n}\n\nexport function requestIdleCallbackIfAvailable(fallbackTimeout: number, deadlineTimeout = Infinity): Promise<void> {\n const { requestIdleCallback } = window\n if (requestIdleCallback) {\n // The function `requestIdleCallback` loses the binding to `window` here.\n // `globalThis` isn't always equal `window` (see https://github.com/fingerprintjs/fingerprintjs/issues/683).\n // Therefore, an error can occur. `call(window,` prevents the error.\n return new Promise((resolve) => requestIdleCallback.call(window, () => resolve(), { timeout: deadlineTimeout }))\n } else {\n return wait(Math.min(fallbackTimeout, deadlineTimeout))\n }\n}\n\nexport function isPromise<T>(value: PromiseLike<T> | unknown): value is PromiseLike<T> {\n return !!value && typeof (value as PromiseLike<T>).then === 'function'\n}\n\n/**\n * Calls a maybe asynchronous function without creating microtasks when the function is synchronous.\n * Catches errors in both cases.\n *\n * If just you run a code like this:\n * ```\n * console.time('Action duration')\n * await action()\n * console.timeEnd('Action duration')\n * ```\n * The synchronous function time can be measured incorrectly because another microtask may run before the `await`\n * returns the control back to the code.\n */\nexport function awaitIfAsync<TResult, TError = unknown>(\n action: () => MaybePromise<TResult>,\n callback: (...args: [success: true, result: TResult] | [success: false, error: TError]) => unknown,\n): void {\n try {\n const returnedValue = action()\n if (isPromise(returnedValue)) {\n returnedValue.then(\n (result) => callback(true, result),\n (error: TError) => callback(false, error),\n )\n } else {\n callback(true, returnedValue)\n }\n } catch (error) {\n callback(false, error as TError)\n }\n}\n\n/**\n * If you run many synchronous tasks without using this function, the JS main loop will be busy and asynchronous tasks\n * (e.g. completing a network request, rendering the page) won't be able to happen.\n * This function allows running many synchronous tasks such way that asynchronous tasks can run too in background.\n */\nexport async function mapWithBreaks<T, U>(\n items: readonly T[],\n callback: (item: T, index: number) => U,\n loopReleaseInterval = 16,\n): Promise<U[]> {\n const results = Array<U>(items.length)\n let lastLoopReleaseTime = Date.now()\n\n for (let i = 0; i < items.length; ++i) {\n results[i] = callback(items[i], i)\n\n const now = Date.now()\n if (now >= lastLoopReleaseTime + loopReleaseInterval) {\n lastLoopReleaseTime = now\n await releaseEventLoop()\n }\n }\n\n return results\n}\n\n/**\n * Makes the given promise never emit an unhandled promise rejection console warning.\n * The promise will still pass errors to the next promises.\n * Returns the input promise for convenience.\n *\n * Otherwise, promise emits a console warning unless it has a `catch` listener.\n */\nexport function suppressUnhandledRejectionWarning<T extends PromiseLike<unknown>>(promise: T): T {\n promise.then(undefined, () => undefined)\n return promise\n}\n","import { MaybePromise, wait } from './async'\nimport { parseSimpleCssSelector } from './data'\n\n/**\n * Creates and keeps an invisible iframe while the given function runs.\n * The given function is called when the iframe is loaded and has a body.\n * The iframe allows to measure DOM sizes inside itself.\n *\n * Notice: passing an initial HTML code doesn't work in IE.\n *\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nexport async function withIframe<T>(\n action: (iframe: HTMLIFrameElement, iWindow: typeof window) => MaybePromise<T>,\n initialHtml?: string,\n domPollInterval = 50,\n): Promise<T> {\n const d = document\n\n // document.body can be null while the page is loading\n while (!d.body) {\n await wait(domPollInterval)\n }\n\n const iframe = d.createElement('iframe')\n\n try {\n await new Promise<void>((_resolve, _reject) => {\n let isComplete = false\n const resolve = () => {\n isComplete = true\n _resolve()\n }\n const reject = (error: unknown) => {\n isComplete = true\n _reject(error)\n }\n\n iframe.onload = resolve\n iframe.onerror = reject\n const { style } = iframe\n style.setProperty('display', 'block', 'important') // Required for browsers to calculate the layout\n style.position = 'absolute'\n style.top = '0'\n style.left = '0'\n style.visibility = 'hidden'\n if (initialHtml && 'srcdoc' in iframe) {\n iframe.srcdoc = initialHtml\n } else {\n iframe.src = 'about:blank'\n }\n d.body.appendChild(iframe)\n\n // WebKit in WeChat doesn't fire the iframe's `onload` for some reason.\n // This code checks for the loading state manually.\n // See https://github.com/fingerprintjs/fingerprintjs/issues/645\n const checkReadyState = () => {\n // The ready state may never become 'complete' in Firefox despite the 'load' event being fired.\n // So an infinite setTimeout loop can happen without this check.\n // See https://github.com/fingerprintjs/fingerprintjs/pull/716#issuecomment-986898796\n if (isComplete) {\n return\n }\n\n // Make sure iframe.contentWindow and iframe.contentWindow.document are both loaded\n // The contentWindow.document can miss in JSDOM (https://github.com/jsdom/jsdom).\n if (iframe.contentWindow?.document?.readyState === 'complete') {\n resolve()\n } else {\n setTimeout(checkReadyState, 10)\n }\n }\n checkReadyState()\n })\n\n while (!iframe.contentWindow?.document?.body) {\n await wait(domPollInterval)\n }\n\n return await action(iframe, iframe.contentWindow as typeof window)\n } finally {\n iframe.parentNode?.removeChild(iframe)\n }\n}\n\n/**\n * Creates a DOM element that matches the given selector.\n * Only single element selector are supported (without operators like space, +, >, etc).\n */\nexport function selectorToElement(selector: string): HTMLElement {\n const [tag, attributes] = parseSimpleCssSelector(selector)\n const element = document.createElement(tag ?? 'div')\n for (const name of Object.keys(attributes)) {\n const value = attributes[name].join(' ')\n // Changing the `style` attribute can cause a CSP error, therefore we change the `style.cssText` property.\n // https://github.com/fingerprintjs/fingerprintjs/issues/733\n if (name === 'style') {\n addStyleString(element.style, value)\n } else {\n element.setAttribute(name, value)\n }\n }\n return element\n}\n\n/**\n * Adds CSS styles from a string in such a way that doesn't trigger a CSP warning (unsafe-inline or unsafe-eval)\n */\nexport function addStyleString(style: CSSStyleDeclaration, source: string): void {\n // We don't use `style.cssText` because browsers must block it when no `unsafe-eval` CSP is presented: https://csplite.com/csp145/#w3c_note\n // Even though the browsers ignore this standard, we don't use `cssText` just in case.\n for (const property of source.split(';')) {\n const match = /^\\s*([\\w-]+)\\s*:\\s*(.+?)(\\s*!([\\w-]+))?\\s*$/.exec(property)\n if (match) {\n const [, name, value, , priority] = match\n style.setProperty(name, value, priority || '') // The last argument can't be undefined in IE11\n }\n }\n}\n\n/**\n * Returns true if the code runs in an iframe, and any parent page's origin doesn't match the current origin\n */\nexport function isAnyParentCrossOrigin(): boolean {\n let currentWindow: Window = window\n\n for (;;) {\n const parentWindow = currentWindow.parent\n if (!parentWindow || parentWindow === currentWindow) {\n return false // The top page is reached\n }\n\n try {\n if (parentWindow.location.origin !== currentWindow.location.origin) {\n return true\n }\n } catch (error) {\n // The error is thrown when `origin` is accessed on `parentWindow.location` when the parent is cross-origin\n if (error instanceof Error && error.name === 'SecurityError') {\n return true\n }\n throw error\n }\n\n currentWindow = parentWindow\n }\n}\n","import { includeComponent } from \"../../factory\";\n\nimport { selectorToElement } from \"../../utils/dom\";\nimport { countTruthy } from \"../../utils/data\";\nimport { wait } from \"../../utils/async\";\nimport { isAndroid, isWebKit } from \"../../utils/browser_\";\nimport { detectBrowser } from \"../system/browser\";\n\n// Floating-point calculations (Math.sin(), Math.log()) produce slightly different results across CPUs due to:\n// Extremely hard to spoof without emulating a different CPU.\n// function getCPUFingerprint(): any {\n// return {\n// sin1: Math.sin(1),\n// log10: Math.log(10),\n// tanh05: Math.tanh(0.5),\n// };\n// }\n\nconst enum SpecialFingerprint {\n /** The browser doesn't support AudioContext or baseLatency */\n NotSupported = -1,\n /** Entropy source is disabled because of console warnings */\n Disabled = -2,\n}\n\nfunction getAudioContextBaseLatency(): any {\n // The signal emits warning in Chrome and Firefox, therefore it is enabled on Safari where it doesn't produce warning\n // and on Android where it's less visible\n const isAllowedPlatform = isAndroid() || isWebKit();\n if (!isAllowedPlatform) {\n return SpecialFingerprint.Disabled;\n }\n\n if (!window.AudioContext) {\n return SpecialFingerprint.NotSupported;\n }\n return new AudioContext().baseLatency ?? SpecialFingerprint.NotSupported;\n}\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/@media/color-gamut\n */\nfunction getColorGamut(): any {\n // rec2020 includes p3 and p3 includes srgb\n for (const gamut of [\"rec2020\", \"p3\", \"srgb\"] as const) {\n if (matchMedia(`(color-gamut: ${gamut})`).matches) {\n return gamut;\n }\n }\n return undefined;\n}\n\nfunction areColorsForced(): any {\n if (doesMatch(\"active\")) {\n return true;\n }\n if (doesMatch(\"none\")) {\n return false;\n }\n return undefined;\n}\n\nfunction doesMatch(value: string) {\n return matchMedia(`(forced-colors: ${value})`).matches;\n}\n\nconst maxValueToCheck = 100;\n\n/**\n * If the display is monochrome (e.g. black&white), the value will be ≥0 and will mean the number of bits per pixel.\n * If the display is not monochrome, the returned value will be 0.\n * If the browser doesn't support this feature, the returned value will be undefined.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/@media/monochrome\n */\nfunction getMonochromeDepth(): any {\n if (!matchMedia(\"(min-monochrome: 0)\").matches) {\n // The media feature isn't supported by the browser\n return undefined;\n }\n\n // A variation of binary search algorithm can be used here.\n // But since expected values are very small (≤10), there is no sense in adding the complexity.\n for (let i = 0; i <= maxValueToCheck; ++i) {\n if (matchMedia(`(max-monochrome: ${i})`).matches) {\n return i;\n }\n }\n\n throw new Error(\"Too high value\");\n}\n\nfunction getOsCpu(): any {\n return (navigator as any).oscpu;\n}\n\n/**\n * Checks for browser-specific (not engine specific) global variables to tell browsers with the same engine apart.\n * Only somewhat popular browsers are considered.\n */\nexport function getVendorFlavors(): any {\n const flavors: string[] = [];\n\n for (const key of [\n // Blink and some browsers on iOS\n \"chrome\",\n\n // Safari on macOS\n \"safari\",\n\n // Chrome on iOS (checked in 85 on 13 and 87 on 14)\n \"__crWeb\",\n \"__gCrWeb\",\n\n // Yandex Browser on iOS, macOS and Android (checked in 21.2 on iOS 14, macOS and Android)\n \"yandex\",\n\n // Yandex Browser on iOS (checked in 21.2 on 14)\n \"__yb\",\n \"__ybro\",\n\n // Firefox on iOS (checked in 32 on 14)\n \"__firefox__\",\n\n // Edge on iOS (checked in 46 on 14)\n \"__edgeTrackingPreventionStatistics\",\n \"webkit\",\n\n // Opera Touch on iOS (checked in 2.6 on 14)\n \"oprt\",\n\n // Samsung Internet on Android (checked in 11.1)\n \"samsungAr\",\n\n // UC Browser on Android (checked in 12.10 and 13.0)\n \"ucweb\",\n \"UCShellJava\",\n\n // Puffin on Android (checked in 9.0)\n \"puffinDevice\",\n\n // UC on iOS and Opera on Android have no specific global variables\n // Edge for Android isn't checked\n ]) {\n const value = (window as unknown as Record<string, unknown>)[key];\n if (value && typeof value === \"object\") {\n flavors.push(key);\n }\n }\n\n const sortedVendorFlavors = flavors.sort();\n\n // If no vendor flavor is detected, default to use the browser name\n if (sortedVendorFlavors.length > 0) {\n return sortedVendorFlavors;\n } else {\n const { name: browsername } = detectBrowser();\n return [browsername];\n }\n}\n\ntype Filters = Record<string, string[]>;\n\n/**\n * Only single element selector are supported (no operators like space, +, >, etc).\n * `embed` and `position: fixed;` will be considered as blocked anyway because it always has no offsetParent.\n * Avoid `iframe` and anything with `[src=]` because they produce excess HTTP requests.\n *\n * The \"inappropriate\" selectors are obfuscated. See https://github.com/fingerprintjs/fingerprintjs/issues/734.\n * A function is used instead of a plain object to help tree-shaking.\n *\n * The function code is generated automatically. See docs/content_blockers.md to learn how to make the list.\n */\nexport function getFilters(): Filters {\n const fromB64 = atob; // Just for better minification\n\n return {\n abpIndo: [\n \"#Iklan-Melayang\",\n \"#Kolom-Iklan-728\",\n \"#SidebarIklan-wrapper\",\n '[title=\"ALIENBOLA\" i]',\n fromB64(\"I0JveC1CYW5uZXItYWRz\"),\n ],\n abpvn: [\n \".quangcao\",\n \"#mobileCatfish\",\n fromB64(\"LmNsb3NlLWFkcw==\"),\n '[id^=\"bn_bottom_fixed_\"]',\n \"#pmadv\",\n ],\n adBlockFinland: [\n \".mainostila\",\n fromB64(\"LnNwb25zb3JpdA==\"),\n \".ylamainos\",\n fromB64(\"YVtocmVmKj0iL2NsaWNrdGhyZ2guYXNwPyJd\"),\n fromB64(\"YVtocmVmXj0iaHR0cHM6Ly9hcHAucmVhZHBlYWsuY29tL2FkcyJd\"),\n ],\n adBlockPersian: [\n \"#navbar_notice_50\",\n \".kadr\",\n 'TABLE[width=\"140px\"]',\n \"#divAgahi\",\n fromB64(\"YVtocmVmXj0iaHR0cDovL2cxLnYuZndtcm0ubmV0L2FkLyJd\"),\n ],\n adBlockWarningRemoval: [\n \"#adblock-honeypot\",\n \".adblocker-root\",\n \".wp_adblock_detect\",\n fromB64(\"LmhlYWRlci1ibG9ja2VkLWFk\"),\n fromB64(\"I2FkX2Jsb2NrZXI=\"),\n ],\n adGuardAnnoyances: [\n \".hs-sosyal\",\n \"#cookieconsentdiv\",\n 'div[class^=\"app_gdpr\"]',\n \".as-oil\",\n '[data-cypress=\"soft-push-notification-modal\"]',\n ],\n adGuardBase: [\n \".BetterJsPopOverlay\",\n fromB64(\"I2FkXzMwMFgyNTA=\"),\n fromB64(\"I2Jhbm5lcmZsb2F0MjI=\"),\n fromB64(\"I2NhbXBhaWduLWJhbm5lcg==\"),\n fromB64(\"I0FkLUNvbnRlbnQ=\"),\n ],\n adGuardChinese: [\n fromB64(\"LlppX2FkX2FfSA==\"),\n fromB64(\"YVtocmVmKj0iLmh0aGJldDM0LmNvbSJd\"),\n \"#widget-quan\",\n fromB64(\"YVtocmVmKj0iLzg0OTkyMDIwLnh5eiJd\"),\n fromB64(\"YVtocmVmKj0iLjE5NTZobC5jb20vIl0=\"),\n ],\n adGuardFrench: [\n \"#pavePub\",\n fromB64(\"LmFkLWRlc2t0b3AtcmVjdGFuZ2xl\"),\n \".mobile_adhesion\",\n \".widgetadv\",\n fromB64(\"LmFkc19iYW4=\"),\n ],\n adGuardGerman: ['aside[data-portal-id=\"leaderboard\"]'],\n adGuardJapanese: [\n \"#kauli_yad_1\",\n fromB64(\"YVtocmVmXj0iaHR0cDovL2FkMi50cmFmZmljZ2F0ZS5uZXQvIl0=\"),\n fromB64(\"Ll9wb3BJbl9pbmZpbml0ZV9hZA==\"),\n fromB64(\"LmFkZ29vZ2xl\"),\n fromB64(\"Ll9faXNib29zdFJldHVybkFk\"),\n ],\n adGuardMobile: [\n fromB64(\"YW1wLWF1dG8tYWRz\"),\n fromB64(\"LmFtcF9hZA==\"),\n 'amp-embed[type=\"24smi\"]',\n \"#mgid_iframe1\",\n fromB64(\"I2FkX2ludmlld19hcmVh\"),\n ],\n adGuardRussian: [\n fromB64(\"YVtocmVmXj0iaHR0cHM6Ly9hZC5sZXRtZWFkcy5jb20vIl0=\"),\n fromB64(\"LnJlY2xhbWE=\"),\n 'div[id^=\"smi2adblock\"]',\n fromB64(\"ZGl2W2lkXj0iQWRGb3hfYmFubmVyXyJd\"),\n \"#psyduckpockeball\",\n ],\n adGuardSocial: [\n fromB64(\"YVtocmVmXj0iLy93d3cuc3R1bWJsZXVwb24uY29tL3N1Ym1pdD91cmw9Il0=\"),\n fromB64(\"YVtocmVmXj0iLy90ZWxlZ3JhbS5tZS9zaGFyZS91cmw/Il0=\"),\n \".etsy-tweet\",\n \"#inlineShare\",\n \".popup-social\",\n ],\n adGuardSpanishPortuguese: [\n \"#barraPublicidade\",\n \"#Publicidade\",\n \"#publiEspecial\",\n \"#queTooltip\",\n \".cnt-publi\",\n ],\n adGuardTrackingProtection: [\n \"#qoo-counter\",\n fromB64(\"YVtocmVmXj0iaHR0cDovL2NsaWNrLmhvdGxvZy5ydS8iXQ==\"),\n fromB64(\"YVtocmVmXj0iaHR0cDovL2hpdGNvdW50ZXIucnUvdG9wL3N0YXQucGhwIl0=\"),\n fromB64(\"YVtocmVmXj0iaHR0cDovL3RvcC5tYWlsLnJ1L2p1bXAiXQ==\"),\n \"#top100counter\",\n ],\n adGuardTurkish: [\n \"#backkapat\",\n fromB64(\"I3Jla2xhbWk=\"),\n fromB64(\"YVtocmVmXj0iaHR0cDovL2Fkc2Vydi5vbnRlay5jb20udHIvIl0=\"),\n fromB64(\"YVtocmVmXj0iaHR0cDovL2l6bGVuemkuY29tL2NhbXBhaWduLyJd\"),\n fromB64(\"YVtocmVmXj0iaHR0cDovL3d3dy5pbnN0YWxsYWRzLm5ldC8iXQ==\"),\n ],\n bulgarian: [\n fromB64(\"dGQjZnJlZW5ldF90YWJsZV9hZHM=\"),\n \"#ea_intext_div\",\n \".lapni-pop-over\",\n \"#xenium_hot_offers\",\n ],\n easyList: [\n \".yb-floorad\",\n fromB64(\"LndpZGdldF9wb19hZHNfd2lkZ2V0\"),\n fromB64(\"LnRyYWZmaWNqdW5reS1hZA==\"),\n \".textad_headline\",\n fromB64(\"LnNwb25zb3JlZC10ZXh0LWxpbmtz\"),\n ],\n easyListChina: [\n fromB64(\"LmFwcGd1aWRlLXdyYXBbb25jbGljayo9ImJjZWJvcy5jb20iXQ==\"),\n fromB64(\"LmZyb250cGFnZUFkdk0=\"),\n \"#taotaole\",\n \"#aafoot.top_box\",\n \".cfa_popup\",\n ],\n easyListCookie: [\n \".ezmob-footer\",\n \".cc-CookieWarning\",\n \"[data-cookie-number]\",\n fromB64(\"LmF3LWNvb2tpZS1iYW5uZXI=\"),\n \".sygnal24-gdpr-modal-wrap\",\n ],\n easyListCzechSlovak: [\n \"#onlajny-stickers\",\n fromB64(\"I3Jla2xhbW5pLWJveA==\"),\n fromB64(\"LnJla2xhbWEtbWVnYWJvYXJk\"),\n \".sklik\",\n fromB64(\"W2lkXj0ic2tsaWtSZWtsYW1hIl0=\"),\n ],\n easyListDutch: [\n fromB64(\"I2FkdmVydGVudGll\"),\n fromB64(\"I3ZpcEFkbWFya3RCYW5uZXJCbG9jaw==\"),\n \".adstekst\",\n fromB64(\"YVtocmVmXj0iaHR0cHM6Ly94bHR1YmUubmwvY2xpY2svIl0=\"),\n \"#semilo-lrectangle\",\n ],\n easyListGermany: [\n \"#SSpotIMPopSlider\",\n fromB64(\"LnNwb25zb3JsaW5rZ3J1ZW4=\"),\n fromB64(\"I3dlcmJ1bmdza3k=\"),\n fromB64(\"I3Jla2xhbWUtcmVjaHRzLW1pdHRl\"),\n fromB64(\"YVtocmVmXj0iaHR0cHM6Ly9iZDc0Mi5jb20vIl0=\"),\n ],\n easyListItaly: [\n fromB64(\"LmJveF9hZHZfYW5udW5jaQ==\"),\n \".sb-box-pubbliredazionale\",\n fromB64(\"YVtocmVmXj0iaHR0cDovL2FmZmlsaWF6aW9uaWFkcy5zbmFpLml0LyJd\"),\n fromB64(\"YVtocmVmXj0iaHR0cHM6Ly9hZHNlcnZlci5odG1sLml0LyJd\"),\n fromB64(\"YVtocmVmXj0iaHR0cHM6Ly9hZmZpbGlhemlvbmlhZHMuc25haS5pdC8iXQ==\"),\n ],\n easyListLithuania: [\n fromB64(\"LnJla2xhbW9zX3RhcnBhcw==\"),\n fromB64(\"LnJla2xhbW9zX251b3JvZG9z\"),\n fromB64(\"aW1nW2FsdD0iUmVrbGFtaW5pcyBza3lkZWxpcyJd\"),\n fromB64(\"aW1nW2FsdD0iRGVkaWt1b3RpLmx0IHNlcnZlcmlhaSJd\"),\n fromB64(\"aW1nW2FsdD0iSG9zdGluZ2FzIFNlcnZlcmlhaS5sdCJd\"),\n ],\n estonian: [fromB64(\"QVtocmVmKj0iaHR0cDovL3BheTRyZXN1bHRzMjQuZXUiXQ==\")],\n fanboyAnnoyances: [\n \"#ac-lre-player\",\n \".navigate-to-top\",\n \"#subscribe_popup\",\n \".newsletter_holder\",\n \"#back-top\",\n ],\n fanboyAntiFacebook: [\".util-bar-module-firefly-visible\"],\n fanboyEnhancedTrackers: [\n \".open.pushModal\",\n \"#issuem-leaky-paywall-articles-zero-remaining-nag\",\n \"#sovrn_container\",\n 'div[class$=\"-hide\"][zoompage-fontsize][style=\"display: block;\"]',\n \".BlockNag__Card\",\n ],\n fanboySocial: [\n \"#FollowUs\",\n \"#meteored_share\",\n \"#social_follow\",\n \".article-sharer\",\n \".community__social-desc\",\n ],\n frellwitSwedish: [\n fromB64(\"YVtocmVmKj0iY2FzaW5vcHJvLnNlIl1bdGFyZ2V0PSJfYmxhbmsiXQ==\"),\n fromB64(\"YVtocmVmKj0iZG9rdG9yLXNlLm9uZWxpbmsubWUiXQ==\"),\n \"article.category-samarbete\",\n fromB64(\"ZGl2LmhvbGlkQWRz\"),\n \"ul.adsmodern\",\n ],\n greekAdBlock: [\n fromB64(\"QVtocmVmKj0iYWRtYW4ub3RlbmV0LmdyL2NsaWNrPyJd\"),\n fromB64(\"QVtocmVmKj0iaHR0cDovL2F4aWFiYW5uZXJzLmV4b2R1cy5nci8iXQ==\"),\n fromB64(\n \"QVtocmVmKj0iaHR0cDovL2ludGVyYWN0aXZlLmZvcnRobmV0LmdyL2NsaWNrPyJd\"\n ),\n \"DIV.agores300\",\n \"TABLE.advright\",\n ],\n hungarian: [\n \"#cemp_doboz\",\n \".optimonk-iframe-container\",\n fromB64(\"LmFkX19tYWlu\"),\n fromB64(\"W2NsYXNzKj0iR29vZ2xlQWRzIl0=\"),\n \"#hirdetesek_box\",\n ],\n iDontCareAboutCookies: [\n '.alert-info[data-block-track*=\"CookieNotice\"]',\n \".ModuleTemplateCookieIndicator\",\n \".o--cookies--container\",\n \"#cookies-policy-sticky\",\n \"#stickyCookieBar\",\n ],\n icelandicAbp: [\n fromB64(\n \"QVtocmVmXj0iL2ZyYW1ld29yay9yZXNvdXJjZXMvZm9ybXMvYWRzLmFzcHgiXQ==\"\n ),\n ],\n latvian: [\n fromB64(\n \"YVtocmVmPSJodHRwOi8vd3d3LnNhbGlkemluaS5sdi8iXVtzdHlsZT0iZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMjBweDsgaGVpZ2h0O\" +\n \"iA0MHB4OyBvdmVyZmxvdzogaGlkZGVuOyBwb3NpdGlvbjogcmVsYXRpdmU7Il0=\"\n ),\n fromB64(\n \"YVtocmVmPSJodHRwOi8vd3d3LnNhbGlkemluaS5sdi8iXVtzdHlsZT0iZGlzcGxheTogYmxvY2s7IHdpZHRoOiA4OHB4OyBoZWlnaHQ6I\" +\n \"DMxcHg7IG92ZXJmbG93OiBoaWRkZW47IHBvc2l0aW9uOiByZWxhdGl2ZTsiXQ==\"\n ),\n ],\n listKr: [\n fromB64(\"YVtocmVmKj0iLy9hZC5wbGFuYnBsdXMuY28ua3IvIl0=\"),\n fromB64(\"I2xpdmVyZUFkV3JhcHBlcg==\"),\n fromB64(\"YVtocmVmKj0iLy9hZHYuaW1hZHJlcC5jby5rci8iXQ==\"),\n fromB64(\"aW5zLmZhc3R2aWV3LWFk\"),\n \".revenue_unit_item.dable\",\n ],\n listeAr: [\n fromB64(\"LmdlbWluaUxCMUFk\"),\n \".right-and-left-sponsers\",\n fromB64(\"YVtocmVmKj0iLmFmbGFtLmluZm8iXQ==\"),\n fromB64(\"YVtocmVmKj0iYm9vcmFxLm9yZyJd\"),\n fromB64(\"YVtocmVmKj0iZHViaXp6bGUuY29tL2FyLz91dG1fc291cmNlPSJd\"),\n ],\n listeFr: [\n fromB64(\"YVtocmVmXj0iaHR0cDovL3Byb21vLnZhZG9yLmNvbS8iXQ==\"),\n fromB64(\"I2FkY29udGFpbmVyX3JlY2hlcmNoZQ==\"),\n fromB64(\"YVtocmVmKj0id2Vib3JhbWEuZnIvZmNnaS1iaW4vIl0=\"),\n \".site-pub-interstitiel\",\n 'div[id^=\"crt-\"][data-criteo-id]',\n ],\n officialPolish: [\n \"#ceneo-placeholder-ceneo-12\",\n fromB64(\"W2hyZWZePSJodHRwczovL2FmZi5zZW5kaHViLnBsLyJd\"),\n fromB64(\n \"YVtocmVmXj0iaHR0cDovL2Fkdm1hbmFnZXIudGVjaGZ1bi5wbC9yZWRpcmVjdC8iXQ==\"\n ),\n fromB64(\"YVtocmVmXj0iaHR0cDovL3d3dy50cml6ZXIucGwvP3V0bV9zb3VyY2UiXQ==\"),\n fromB64(\"ZGl2I3NrYXBpZWNfYWQ=\"),\n ],\n ro: [\n fromB64(\"YVtocmVmXj0iLy9hZmZ0cmsuYWx0ZXgucm8vQ291bnRlci9DbGljayJd\"),\n fromB64(\n \"YVtocmVmXj0iaHR0cHM6Ly9ibGFja2ZyaWRheXNhbGVzLnJvL3Ryay9zaG9wLyJd\"\n ),\n fromB64(\n \"YVtocmVmXj0iaHR0cHM6Ly9ldmVudC4ycGVyZm9ybWFudC5jb20vZXZlbnRzL2NsaWNrIl0=\"\n ),\n fromB64(\"YVtocmVmXj0iaHR0cHM6Ly9sLnByb2ZpdHNoYXJlLnJvLyJd\"),\n 'a[href^=\"/url/\"]',\n ],\n ruAd: [\n fromB64(\"YVtocmVmKj0iLy9mZWJyYXJlLnJ1LyJd\"),\n fromB64(\"YVtocmVmKj0iLy91dGltZy5ydS8iXQ==\"),\n fromB64(\"YVtocmVmKj0iOi8vY2hpa2lkaWtpLnJ1Il0=\"),\n \"#pgeldiz\",\n \".yandex-rtb-block\",\n ],\n thaiAds: [\n \"a[href*=macau-uta-popup]\",\n fromB64(\"I2Fkcy1nb29nbGUtbWlkZGxlX3JlY3RhbmdsZS1ncm91cA==\"),\n fromB64(\"LmFkczMwMHM=\"),\n \".bumq\",\n \".img-kosana\",\n ],\n webAnnoyancesUltralist: [\n \"#mod-social-share-2\",\n \"#social-tools\",\n fromB64(\"LmN0cGwtZnVsbGJhbm5lcg==\"),\n \".zergnet-recommend\",\n \".yt.btn-link.btn-md.btn\",\n ],\n };\n}\n\n/**\n * The order of the returned array means nothing (it's always sorted alphabetically).\n *\n * Notice that the source is slightly unstable.\n * Safari provides a 2-taps way to disable all content blockers on a page temporarily.\n * Also content blockers can be disabled permanently for a domain, but it requires 4 taps.\n * So empty array shouldn't be treated as \"no blockers\", it should be treated as \"no signal\".\n * If you are a website owner, don't make your visitors want to disable content blockers.\n */\nasync function getDomBlockers(): Promise<any> {\n if (!isApplicable()) {\n return undefined;\n }\n\n const filters = getFilters();\n const filterNames = Object.keys(filters) as Array<keyof typeof filters>;\n const allSelectors = ([] as string[]).concat(\n ...filterNames.map((filterName) => filters[filterName])\n );\n const blockedSelectors = await getBlockedSelectors(allSelectors);\n\n const activeBlockers = filterNames.filter((filterName) => {\n const selectors = filters[filterName];\n const blockedCount = countTruthy(\n selectors.map((selector) => blockedSelectors[selector])\n );\n return blockedCount > selectors.length * 0.6;\n });\n activeBlockers.sort();\n\n return activeBlockers;\n}\n\nfunction isApplicable(): boolean {\n // Safari (desktop and mobile) and all Android browsers keep content blockers in both regular and private mode\n return isWebKit() || isAndroid();\n}\n\nasync function getBlockedSelectors<T extends string>(\n selectors: readonly T[]\n): Promise<{ [K in T]?: true }> {\n const d = document;\n const root = d.createElement(\"div\");\n const elements = new Array<HTMLElement>(selectors.length);\n const blockedSelectors: { [K in T]?: true } = {}; // Set() isn't used just in case somebody need older browser support\n\n forceShow(root);\n\n // First create all elements that can be blocked. If the DOM steps below are done in a single cycle,\n // browser will alternate tree modification and layout reading, that is very slow.\n for (let i = 0; i < selectors.length; ++i) {\n const element = selectorToElement(selectors[i]);\n if (element.tagName === \"DIALOG\") {\n (element as HTMLDialogElement).show();\n }\n const holder = d.createElement(\"div\"); // Protects from unwanted effects of `+` and `~` selectors of filters\n forceShow(holder);\n holder.appendChild(element);\n root.appendChild(holder);\n elements[i] = element;\n }\n\n // document.body can be null while the page is loading\n while (!d.body) {\n await wait(50);\n }\n d.body.appendChild(root);\n\n try {\n // Then check which of the elements are blocked\n for (let i = 0; i < selectors.length; ++i) {\n if (!elements[i].offsetParent) {\n blockedSelectors[selectors[i]] = true;\n }\n }\n } finally {\n // Then remove the elements\n root.parentNode?.removeChild(root);\n }\n\n return blockedSelectors;\n}\n\nfunction forceShow(element: HTMLElement) {\n element.style.setProperty(\"visibility\", \"hidden\", \"important\");\n element.style.setProperty(\"display\", \"block\", \"important\");\n}\n\nincludeComponent(\"domBlockers\", getDomBlockers);\nincludeComponent(\"vendorFlavour\", getVendorFlavors);\nincludeComponent(\"monochrome\", getMonochromeDepth);\nincludeComponent(\"forcedColors\", areColorsForced);\nincludeComponent(\"colorGamut\", getColorGamut);\nincludeComponent(\"osCpu\", getOsCpu);\nincludeComponent(\"audioLatency\", getAudioContextBaseLatency);\n\n","import { getFingerprint } from './modules/fp'\nimport { detectTorBrowser } from './modules/tor'\nimport { detectIncognito } from './modules/incognito'\nimport { botDetection } from './modules/bot'\nimport { detectBrowser } from './components/system/browser'\nimport { getOs } from './modules/os'\nimport { getDeviceDetails } from './modules/device'\nimport { getBrowserDetails } from './modules/browserDetails'\nimport './components'\n\nexport { getFingerprint, detectTorBrowser, detectIncognito, botDetection, detectBrowser, getOs, getDeviceDetails, getBrowserDetails }\n\ninterface SdkInfo {\n name: string;\n version: string;\n}\n\nexport const buildInitialPayload = async (request_id: string, sdkInfo: SdkInfo) => {\n const [\n fingerprint,\n torResult,\n botResult,\n incognito,\n osResult,\n deviceDetails,\n browserDetails,\n ] = await fetchModules();\n\n return {\n request_id,\n device: {\n fingerprint_id: fingerprint.hash,\n type: \"web\",\n os: deviceDetails.deviceOs,\n os_version: osResult.version,\n raw_device_data: fingerprint.data,\n browserDetails: browserDetails,\n bot: botResult,\n tampering: deviceDetails.tampering,\n incognito: incognito,\n tor: torResult,\n },\n sdk: {\n name: sdkInfo?.name,\n version: sdkInfo?.version\n }\n };\n};\n\nexport async function fetchModules() {\n return await Promise.all([\n getFingerprint(),\n detectTorBrowser(),\n botDetection(),\n detectIncognito(),\n getOs(),\n getDeviceDetails(),\n getBrowserDetails(),\n ]);\n}\n","import { GingerClientError, FieldMetrics, FillEnum, FillMethod, pageVisibility, Field } from \"../core\";\n\ninterface TrackedFieldMetrics extends FieldMetrics {\n readonly element: HTMLInputElement | HTMLTextAreaElement;\n}\n\ninterface EventConfig {\n readonly pauseThresholdMs: number;\n}\n\nconst { getCount, addListener, removeListener } = pageVisibility();\n\nclass EventTracker {\n private static readonly DEFAULT_CONFIG: EventConfig = {\n pauseThresholdMs: 1500,\n };\n\n private readonly config: EventConfig;\n private isInitialized = false;\n private readonly fields: TrackedFieldMetrics[] = [];\n private readonly trackedFieldIds = new Set<string>();\n\n constructor(config: Partial<EventConfig> = {}) {\n this.config = { ...EventTracker.DEFAULT_CONFIG, ...config };\n addListener();\n }\n\n /**\n * Initialize tracking for multiple form fields\n */\n public initializeTracking(fields: readonly Field[]): void {\n const newFields = fields.filter(\n (field) => !this.trackedFieldIds.has(field.id)\n );\n\n newFields.forEach((field) => this.trackField(field));\n this.isInitialized = true;\n }\n\n /**\n * Get all tracked metrics data (excluding DOM elements)\n */\n get metrics(): FieldMetrics[] {\n this.ensureInitialized();\n return this.fields.map(({ element, ...field }) => field);\n }\n\n /**\n * Remove tracking from specific field or all fields\n */\n public removeTracking(fieldId?: string): void {\n if (fieldId) {\n this.removeFieldTracking(fieldId);\n } else {\n this.removeAllTracking();\n }\n }\n\n // Private implementation methods\n\n private trackField(field: Field): void {\n const { id, ltm } = field;\n const element = this.getValidElement(id);\n const fieldMetric = this.createFieldMetric(id, element, ltm);\n\n this.fields.push(fieldMetric);\n this.trackedFieldIds.add(id);\n\n // Use bound method to maintain context\n const boundHandler = this.createInputHandler(fieldMetric);\n element.addEventListener(\"input\", boundHandler);\n }\n\n private getValidElement(id: string): HTMLInputElement | HTMLTextAreaElement {\n const element = document.getElementById(id);\n\n if (!element) {\n throw new GingerClientError(\n `Element with ID \"${id}\" was not found in the DOM. Please ensure the ID is correctly assigned to an input element.`\n );\n }\n\n if (!this.isValidInputElement(element)) {\n throw new GingerClientError(\n `Element with ID \"${id}\" must be an HTMLInputElement or HTMLTextAreaElement.`\n );\n }\n\n return element;\n }\n\n private isValidInputElement(\n element: Element\n ): element is HTMLInputElement | HTMLTextAreaElement {\n return (\n element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement\n );\n }\n\n private createFieldMetric(\n id: string,\n element: HTMLInputElement | HTMLTextAreaElement,\n ltm?: boolean\n ): TrackedFieldMetrics {\n return {\n field_name: id,\n started_at: 0,\n ended_at: 0,\n interaction_count: 0,\n fill_method: null,\n paste_count: 0,\n ltm: ltm ?? false,\n corrections_count: 0,\n pauses: 0,\n pauseDurations: [],\n element,\n };\n }\n\n private createInputHandler(field: TrackedFieldMetrics) {\n return (event: Event): void => {\n this.handleInput(field, event as InputEvent);\n };\n }\n\n private handleInput(\n currentField: TrackedFieldMetrics,\n event: InputEvent\n ): void {\n const now = performance.now();\n const lastInteractionTime = currentField.ended_at || 0;\n\n const interactions = this.analyzeInteraction(\n currentField,\n event,\n now,\n lastInteractionTime\n );\n\n this.updateFieldMetrics(currentField, interactions, now);\n }\n\n private analyzeInteraction(\n field: TrackedFieldMetrics,\n event: InputEvent,\n now: number,\n lastInteractionTime: number\n ) {\n const fillMethod = this.determineFillMethod(field, event);\n\n return {\n fillMethod,\n isCorrection: this.isCorrection(event),\n isPaste: this.isPaste(fillMethod, event),\n isPause: this.isPause(now, lastInteractionTime),\n pauseDuration: now - lastInteractionTime,\n };\n }\n\n private updateFieldMetrics(\n field: TrackedFieldMetrics,\n interactions: ReturnType<typeof this.analyzeInteraction>,\n now: number\n ): void {\n // Initialize start time on first interaction\n if (!field.started_at) {\n field.started_at = now;\n }\n\n field.ended_at = now;\n field.fill_method = interactions.fillMethod;\n field.interaction_count += 1;\n\n if (interactions.isCorrection) field.corrections_count += 1;\n if (interactions.isPaste) field.paste_count += 1;\n if (interactions.isPause) {\n field.pauses += 1;\n field.pauseDurations.push(interactions.pauseDuration);\n }\n }\n\n private determineFillMethod(\n field: TrackedFieldMetrics,\n event: InputEvent\n ): FillMethod {\n const inputType = event.inputType;\n if (!inputType) return FillEnum.paste;\n\n const currentMethod: FillMethod =\n inputType === \"insertText\"\n ? FillEnum.typed\n : inputType === \"insertFromPaste\"\n ? FillEnum.paste\n : FillEnum.mixed;\n\n // If methods have been mixed, maintain \"mixed\" state\n if (field.fill_method && field.fill_method !== currentMethod) {\n return FillEnum.mixed;\n }\n\n return currentMethod;\n }\n\n private isCorrection(event: InputEvent): boolean {\n return event.inputType === \"deleteContentBackward\";\n }\n\n private isPaste(fillMethod: FillMethod, event: InputEvent): boolean {\n return (\n fillMethod === FillEnum.paste || event.inputType === \"insertFromPaste\"\n );\n }\n\n private isPause(now: number, lastInteractionTime: number): boolean {\n if (lastInteractionTime === 0) return false;\n\n const timeSinceLastKeystroke = now - lastInteractionTime;\n return timeSinceLastKeystroke > this.config.pauseThresholdMs;\n }\n\n private removeFieldTracking(fieldId: string): void {\n const index = this.fields.findIndex(\n (field) => field.field_name === fieldId\n );\n\n if (index === -1) return;\n\n const field = this.fields[index];\n this.cleanupFieldTracking(field);\n\n this.fields.splice(index, 1);\n this.trackedFieldIds.delete(fieldId);\n }\n\n private removeAllTracking(): void {\n this.fields.forEach((field) => this.cleanupFieldTracking(field));\n this.fields.length = 0;\n this.trackedFieldIds.clear();\n }\n\n private cleanupFieldTracking(field: TrackedFieldMetrics): void {\n // Note: We can't remove the exact handler since we're using bound methods\n // In a real implementation, you'd want to store the bound handlers\n field.element.removeEventListener(\"input\", this.createInputHandler(field));\n }\n\n private ensureInitialized(): void {\n if (!this.isInitialized) {\n throw new GingerClientError(\n \"Ginger.trackEvent must be initialized before data can be fetched.\"\n );\n }\n }\n}\n\n// Singleton instance for the module\nconst eventTracker = new EventTracker();\n\n// Public API exports\nexport const trackInputs = (fields: readonly Field[]): void => {\n eventTracker.initializeTracking(fields);\n};\n\nexport const getTrackedFields = (): {\n distractions_count: number;\n fields: FieldMetrics[];\n} => {\n return {\n distractions_count: getCount(),\n fields: eventTracker.metrics,\n };\n};\n\nexport const removeTracking = (fieldId?: string): void => {\n eventTracker.removeTracking(fieldId);\n};\n\nexport { EventTracker, removeListener };\n","import {\n trackInputs,\n getTrackedFields,\n removeListener,\n} from \"../behaviour\";\n\nimport { buildInitialPayload } from \"../device\";\n\nimport {\n generateRequestId,\n GingerClientError,\n HttpClient,\n GingerHttpClient,\n BehaviourPayloadResponse,\n Configurations,\n EVENT_TYPES,\n EventParams,\n Payload,\n PayloadResponse,\n BehaviourPayload,\n BehaviourParams,\n PayloadResponseData,\n BehaviourPayloadResponseData,\n} from \"../core\";\n\ninterface GingerClient {\n initialize(configs: Configurations): Promise<PayloadResponse | undefined>;\n trackEvent(params: BehaviourParams): void;\n getTrackedData(): BehaviourPayload;\n submitEvent(): Promise<BehaviourPayloadResponseData>;\n}\n\nexport class GingerJsClient implements GingerClient {\n private readonly requestId = generateRequestId();\n private deviceResponse: PayloadResponseData | undefined;\n private isInitialized: boolean = false;\n private trackDetails: EventParams | undefined;\n private httpClient: HttpClient;\n\n constructor({ apikey }: Configurations) {\n this.httpClient = new GingerHttpClient(apikey);\n }\n\n async initialize() {\n try {\n const sdkInfo = { name: '@ginger-ai/ginger-js', version: '0.0.2' };\n const payload = await buildInitialPayload(this.requestId, sdkInfo);\n const response = await this.httpClient.post<Payload, PayloadResponse>({\n url: `/api/v1/devices`,\n payload,\n });\n\n this.isInitialized = true;\n this.deviceResponse = response.data;\n\n return response;\n } catch (error) {\n this.isInitialized = false;\n throw new GingerClientError(`Initialization failed: ${error}`);\n }\n }\n\n trackEvent({ event_type, track_fields, request_id }: BehaviourParams): void {\n if (!this.isInitialized) {\n throw new GingerClientError(\n \"Unsuccessful Initialization. Cannot track behaviour.\"\n );\n }\n\n if (!EVENT_TYPES.includes(event_type)) {\n throw new GingerClientError(\n `Invalid event type: ${event_type}. Allowed types are: ${EVENT_TYPES.join(\n \", \"\n )}`\n );\n }\n\n trackInputs(track_fields);\n this.trackDetails = {\n event_type,\n request_id,\n fingerprint_id: this.deviceResponse?.fingerprint_id || \"\",\n };\n }\n\n /**\n * Get tracked data\n */\n getTrackedData = () => {\n if (!this.isInitialized) {\n throw new GingerClientError(\n \"Unsuccessful Initialization. Cannot get tracked data.\"\n );\n }\n\n if (!this.trackDetails) {\n throw new GingerClientError(\n \"Tracking not initiated. Call `trackEvent` before getting tracked data.\"\n );\n }\n\n const trackData = getTrackedFields();\n\n return {\n event_type: this.trackDetails.event_type,\n request_id: this.trackDetails.request_id,\n fingerprint_id: this.trackDetails.fingerprint_id,\n data: { ...trackData },\n };\n };\n\n /**\n * Call submitEvent to submit tracked data\n */\n submitEvent = async () => {\n const payload = this.getTrackedData();\n\n try {\n const response = await this.httpClient.post<\n BehaviourPayload,\n BehaviourPayloadResponse\n >({ url: `/api/v1/events`, payload });\n\n removeListener();\n return response.data;\n } catch (error) {\n throw new GingerClientError(\n `Tracked Data submission failed: ${String(error)}`\n );\n }\n };\n}\n"],"names":["generateRequestId","timestamp","Date","now","base34Alphabet","slice","tripleRecursivebase34Alphabet","toBase34","n","result","Math","floor","length","count","MAX_BASE_34","decoded","str","char","value","indexOf","toUpperCase","Error","fromBase34","max","maxBase34","random","getRandomSalt","GingerError","constructor","message","statusCode","response","super","this","name","GingerClientError","ALLOWED_DEVICE_TYPES","FillEnum","EVENT_TYPES","CONSTANTS","pageVisibility","leaveCount","visibilityHandler","document","visibilityState","getCount","addListener","addEventListener","removeListener","removeEventListener","makeRequest","async","url","payload","method","apikey","fetch","headers","Accept","Authorization","body","JSON","stringify","ok","jsonify","json","error","status","handleException","Method","GingerHttpClient","key","validatePresence","basePath","includes","getBasePath","post","options","POST","fullPath","e","exclude","include","logging","components","includeComponent","creationFunction","window","timeoutInstance","timeout","fmix","input","imul","C","Uint32Array","rotl","m","hash","seed","text","TextEncoder","encode","buffer","ArrayBuffer","TypeError","blocks","byteLength","view32","i","k","subarray","reminder","tail","Uint8Array","finalize","byteArray","Array","from","map","byte","toString","padStart","join","getFingerprintData","promiseMap","Object","fromEntries","entries","filter","some","startsWith","keys","promises","values","resolvedValues","timeoutTime","timeoutVal","Promise","all","p","race","t","val","resolve","setTimeout","raceAll","resolvedComponents","forEach","index","undefined","filterFingerprintData","obj","excludeList","includeList","path","currentPath","isArray","isExcluded","exclusion","isIncluded","inclusion","filtered","getFingerprint","fingerprintData","serializedFingerprint","serializedObject","thisHash","componentsUsedForHash","data","fpdata","getHashRelevantKeys","audio","fonts","hardware","math","permissions","screen","system","emojiFingerprint","vendorFlavour","colorGamut","canvas","webglBasics","webGlBasics","detectTorBrowser","score","Intl","DateTimeFormat","resolvedOptions","timeZone","webGLInfo","getWebGLInfo","vendor","RTCPeerConnection","navigator","deviceMemory","hardwareConcurrency","credentials","geolocation","confidence","toFixed","createElement","gl","getContext","renderer","debugInfo","getExtension","getParameter","UNMASKED_VENDOR_WEBGL","UNMASKED_RENDERER_WEBGL","detectIncognito","reject","browser_name","__callback","feid","toFixedEngineID","neg","parseInt","isMSIE","msSaveBlob","eval","newSafariTest","tmp_name","String","indexedDB","open","onupgradeneeded","res","target","createObjectStore","autoIncrement","put","Blob","close","deleteDatabase","storage","estimate","then","quota","catch","safariPrivateTest","maxTouchPoints","openDB","openDatabase","localStorage","setItem","removeItem","oldSafariTest","storageQuotaChromePrivateTest","webkitTemporaryStorage","queryUsageAndQuota","_","round","w","performance","memory","jsHeapSizeLimit","getQuotaLimit","chromePrivateTest","self","allSettled","fs","webkitRequestFileSystem","ua","userAgent","match","brave","identifyChromium","serviceWorker","extendStatics","d","b","setPrototypeOf","__proto__","prototype","hasOwnProperty","call","__awaiter","thisArg","_arguments","P","generator","fulfilled","step","next","rejected","done","apply","__generator","f","y","label","sent","trys","ops","g","create","Iterator","verb","Symbol","iterator","v","op","pop","push","__spreadArray","to","pack","arguments","ar","l","concat","SuppressedError","BotKind","BotdError","_super","state","_this","__","__extends","collect","sources","sourcesKeys","_a","sourceKey","_b","error_1","_c","_d","arrayIncludes","arr","strIncludes","getObjectProps","getOwnPropertyNames","_i","_loop_1","array","callback","find","arrayFind","test","keys_1","state_1","countTruthy","reduce","sum","detectors","detectAppVersion","appVersion","detectDocumentAttributes","documentElementKeys","detectErrorTrace","errorTrace","detectEvalLengthInconsistency","evalLength","browserKind","browserEngineKind","detectFunctionBind","functionBind","detectLanguagesLengthInconsistency","languages","detectNotificationPermissions","notificationPermissions","detectPluginsArray","pluginsArray","detectPluginsLengthInconsistency","pluginsLength","android","detectProcess","process","type","versions","electron","detectUserAgent","detectWebDriver","webDriver","detectWebGL","webGL","detectWindowExternal","windowExternal","detectWindowSize","windowSize","documentFocus","outerWidth","outerHeight","detectMimeTypesConsistent","mimeTypesConsistent","detectProductSub","productSub","detectDistinctiveProperties","distinctiveProps","bot","getBrowserEngineKind","documentElement","style","isItChromium","isItGecko","toLowerCase","hasFocus","rtt","connection","innerWidth","innerHeight","plugins","PluginArray","stack","external","mimeTypes","isConsistent","getPrototypeOf","MimeTypeArray","MimeType","canvasElement","webGLContext","VENDOR","RENDERER","webdriver","language","userLanguage","browserLanguage","systemLanguage","Reflect","split","permissionStatus","Notification","query","permission","getAttributeNames","Function","bind","errorPrefix","botName","distinctivePropsList","windowProps","documentProps","props","windowContains","documentContains","BotDetector","detections","getComponents","getDetections","detect","finalDetection","detectorName","detectorRes","detector","detection","botKind","load","monitoring","__fpjs_d_m","request","XMLHttpRequest","send","console","monitor","botDetection","getBrowserName","detectBrowser","version","engine","signatures","toFixedErrorLength","functionToStringLength","detectByEngineSignatures","getEngineSignatures","isBrave","chrome","app","runtime","csi","loadTimes","opr","opera","InstallTrigger","sidebar","HTMLElement","safari","pushNotification","msCredentials","documentMode","detectByFeatures","registerProtocolHandler","detectByProtocolHandlers","docStyle","getComputedStyle","getPropertyValue","detectByCssProperties","chromeLoad","firstPaintTime","requestTime","detectByPerformance","err","toDataURL","img","Image","loadCount","onload","onerror","src","__JQUERY_OBJECT__","detectByJsBehavior","CSS","supports","msLaunchUri","MSInputMethodContext","webstore","ctx","width","height","font","textBaseline","fillText","imageData","getImageData","detectEdgeBrowser","plugin","chromeMatch","chromeVersion","detectChromeBrowser","google","detectBraveBrowser","grouped","acc","curr","maxConfidence","detectedBrowser","browser","hasChromePdfViewer","hasEdgePluginPattern","isActuallyEdge","min","browserName","edgeMatch","braveMatch","getBrowserVersion","USER_AGENT","EMPTY","FUNC_TYPE","UNDEF_TYPE","OBJ_TYPE","STR_TYPE","UA_BROWSER","UA_CPU","UA_DEVICE","UA_ENGINE","UA_OS","UA_RESULT","NAME","TYPE","VERSION","ARCHITECTURE","MAJOR","MODEL","CONSOLE","MOBILE","TABLET","SMARTTV","WEARABLE","XR","EMBEDDED","INAPP","BRANDS","FORMFACTORS","FULLVERLIST","PLATFORM","PLATFORMVER","BITNESS","CH_HEADER","CH_HEADER_FULL_VER_LIST","CH_HEADER_ARCH","CH_HEADER_BITNESS","CH_HEADER_FORM_FACTORS","CH_HEADER_MOBILE","CH_HEADER_MODEL","CH_HEADER_PLATFORM","CH_HEADER_PLATFORM_VER","CH_ALL_VALUES","AMAZON","APPLE","ASUS","BLACKBERRY","GOOGLE","HUAWEI","LENOVO","HONOR","LG","MICROSOFT","MOTOROLA","NVIDIA","ONEPLUS","OPPO","SAMSUNG","SHARP","SONY","XIAOMI","ZEBRA","CHROME","CHROMIUM","CHROMECAST","EDGE","FIREFOX","OPERA","FACEBOOK","SOGOU","PREFIX_MOBILE","SUFFIX_BROWSER","WINDOWS","NAVIGATOR","NAVIGATOR_UADATA","userAgentData","enumerize","enums","has","str1","str2","lowerize","isString","isExtensions","deep","prop","itemListToArray","header","tokens","strip","token","trim","brand","majorize","setProps","propName","pattern","replace","stripQuotes","len","substring","rgxMapper","arrays","j","q","matches","regex","exec","strMapper","windowsVersionMap","ME","XP","Vista","NT","formFactorsMap","embedded","mobile","tablet","smarttv","wearable","xr","browserHintsMap","Chrome","Edge","Yandex","defaultRegexes","cpu","device","OnePlus","os","defaultProps","init","isIgnore","isIgnoreRgx","createIData","item","itemType","init_props","is_ignoreProps","is_ignoreRgx","toString_props","IData","getItem","withClientHints","getHighEntropyValues","setCH","UACHData","parseCH","get","withFeatureCheck","detectFeature","is","strToCheck","cb","that","IDataResolve","resolveData","uach","isHttpUACH","UAItem","rgxMap","uaCH","set","ch","standalone","parseUA","prevName","brands","brandName","brandVersion","archName","reParse","ff","idx","osName","osVersion","parse","UAParser","extensions","append","kv","getResult","httpUACH","regexMap","defaultRgx","mergedRgx","extraRgx","extend","createItemFunc","getBrowser","getCPU","getDevice","getEngine","getOS","setUA","BROWSER","CPU","DEVICE","ENGINE","OS","getOs","device_type","getDeviceType","normalizeOs","platform","lowerPlatform","patterns","ios","macos","windows","linux","determineDeviceType","claimedMobile","hasTouch","screenWidth","realOs","convertToTwoDP","num","parseFloat","analyzeSpoofing","claimed","signals","conflicts","analysis","spoofingConfidence","isSpoofed","detectionConflicts","realPlatform","realDeviceType","touchPoints","claimedOs","gpuOs","platformOs","actualPlatform","actualOs","suspectedOs","gpuVendor","gpuRenderer","gpuConflict","gpuSuggestedOs","preliminaryRealDeviceType","normalizedClaimedType","guessedDeviceType","determinedType","getDeviceDetails","initialResults","pixelRatio","userAgentString","devicePixelRatio","getSignalData","uaData","lowerUa","guessedType","guessDeviceTypeFromUA","brandMatch","versionMatch","RegExp","getClaimedData","deviceOs","deviceType","tampering","getBrowserDetails","user_agent","getCommonPixels","images","finalData","indice","u","getMostFrequent","pixelArray","Uint8ClampedArray","ImageData","frequencyMap","mostFrequent","sampleRate","numSamples","audioContext","OfflineAudioContext","webkitOfflineAudioContext","audioBuffer","createBufferSource","analyser","createAnalyser","frequencyData","Float32Array","frequencyBinCount","getFloatFrequencyData","oscillator","createOscillator","frequency","compressor","createDynamicsCompressor","threshold","knee","ratio","attack","release","connect","destination","start","oncomplete","maxChannels","maxChannelCount","channelCountMode","startRendering","_RUNS","wait","durationMs","resolveWith","imageDatas","gradient","createLinearGradient","addColorStop","fillStyle","fillRect","randomText","beginPath","moveTo","lineTo","strokeStyle","lineWidth","stroke","generateCanvasImageData","commonImageDataHash","availableFonts","baseFonts","measureSingleFont","measureText","getVideoCard","shadingLanguageVersion","SHADING_LANGUAGE_VERSION","vendorUnmasked","rendererUnmasked","getArchitecture","u8","Infinity","mostFrequentValuesInArrayOfDictionaries","mostFrequentValueForKey","element","highestFrequency","mostFrequentValue","permission_keys","isWebKit","isSafariWebKit","func","print","isGecko","isAndroid","isChromium","Audio","iframe","setAttribute","setProperty","appendChild","iframeDocument","contentDocument","contentWindow","removeChild","ephemeralIFrame","defaultWidths","results","fontWidth","memoryInfo","videocard","architecture","timezone","permissions_to_check","permissionPromises","retries","feature","getBrowserPermissionsOnce","resolvedPermissions","colorDepth","HTMLButtonElement","isWebKit616OrNewer","s","parseDimension","replacement","isNaN","replaceNaN","toInt","dimensions","sort","reverse","getUnstableScreenResolution","regexes","browserNameMap","edg","samsung","groups","createWebGLFingerprint","vertexShaderSource","fragmentShaderSource","vertexShader","createShader","VERTEX_SHADER","fragmentShader","FRAGMENT_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","getShaderInfoLog","shaderProgram","createProgram","attachShader","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","useProgram","numSpokes","vertices","angleIncrement","PI","angle","cos","sin","vertexBuffer","createBuffer","bindBuffer","ARRAY_BUFFER","bufferData","STATIC_DRAW","positionAttribute","getAttribLocation","enableVertexAttribArray","vertexAttribPointer","FLOAT","viewport","clearColor","clear","COLOR_BUFFER_BIT","drawArrays","LINES","pixelData","readPixels","RGBA","UNSIGNED_BYTE","drawingBufferWidth","drawingBufferHeight","createWebGLImageData","commonImageHash","getApplePayVersion","location","protocol","ApplePaySession","versionCheck","supportsVersion","cache","webgl","context","getWebGLContext","isValidParameterGetter","debugExtension","imageHash","filename","description","browserDetails","cookieEnabled","product","applePayVersion","TEST_EMOJIS","TEST_FONTS","renderEmojiToCanvas","emoji","fontFamily","size","textAlign","simplifyPixelData","pixels","simplified","combinedData","emojiFingerprintHash","emojiDetails","uniqueEmojisRendered","integrate","a","h","selectorToElement","selector","tag","attributes","errorMessage","tagMatch","partsRegex","addAttribute","part","attributeMatch","parseSimpleCssSelector","addStyleString","source","property","priority","doesMatch","matchMedia","acos","asin","atan","cosh","E","largeCos","largeSin","largeTan","tan","log","pi","sinh","sqrt","tanh","forceShow","filters","fromB64","atob","abpIndo","abpvn","adBlockFinland","adBlockPersian","adBlockWarningRemoval","adGuardAnnoyances","adGuardBase","adGuardChinese","adGuardFrench","adGuardGerman","adGuardJapanese","adGuardMobile","adGuardRussian","adGuardSocial","adGuardSpanishPortuguese","adGuardTrackingProtection","adGuardTurkish","bulgarian","easyList","easyListChina","easyListCookie","easyListCzechSlovak","easyListDutch","easyListGermany","easyListItaly","easyListLithuania","estonian","fanboyAnnoyances","fanboyAntiFacebook","fanboyEnhancedTrackers","fanboySocial","frellwitSwedish","greekAdBlock","hungarian","iDontCareAboutCookies","icelandicAbp","latvian","listKr","listeAr","listeFr","officialPolish","ro","ruAd","thaiAds","webAnnoyancesUltralist","getFilters","filterNames","allSelectors","filterName","blockedSelectors","selectors","root","elements","tagName","show","holder","offsetParent","parentNode","getBlockedSelectors","activeBlockers","flavors","sortedVendorFlavors","browsername","gamut","oscpu","AudioContext","baseLatency","buildInitialPayload","request_id","sdkInfo","fingerprint","torResult","botResult","incognito","osResult","deviceDetails","fetchModules","fingerprint_id","os_version","raw_device_data","tor","sdk","EventTracker","config","isInitialized","fields","trackedFieldIds","Set","DEFAULT_CONFIG","initializeTracking","field","id","trackField","metrics","ensureInitialized","removeTracking","fieldId","removeFieldTracking","removeAllTracking","ltm","getValidElement","fieldMetric","createFieldMetric","add","boundHandler","createInputHandler","getElementById","isValidInputElement","HTMLInputElement","HTMLTextAreaElement","field_name","started_at","ended_at","interaction_count","fill_method","paste_count","corrections_count","pauses","pauseDurations","event","handleInput","currentField","lastInteractionTime","interactions","analyzeInteraction","updateFieldMetrics","fillMethod","determineFillMethod","isCorrection","isPaste","isPause","pauseDuration","inputType","paste","currentMethod","typed","mixed","pauseThresholdMs","findIndex","cleanupFieldTracking","splice","delete","eventTracker","GingerJsClient","requestId","getTrackedData","trackDetails","trackData","distractions_count","event_type","submitEvent","httpClient","initialize","deviceResponse","trackEvent","track_fields"],"mappings":"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G7BvV,EAAIqV,UAAY,uBAChBrV,EAAIK,SAASkV,GAAY,IAAM,MAG/BvV,EAAIwV,YACJxV,EAAIyV,OAAO,EAAG,GACdzV,EAAI0V,OAAsB,EAAfjqB,EAAOwU,MAAU,EAAGxU,EAAOyU,QACtCF,EAAI2V,YAAc,QAClB3V,EAAI4V,UAAY,EAChB5V,EAAI6V,SAEJ,MAAMvV,EAAYN,EAAIO,aAAa,EAAG,EAAG9U,EAAOwU,MAAOxU,EAAOyU,QAE9D,OAAOI,CACX,CA1D0EwV,IAGlE3sB,EACI,CACI4sB,oBAAuB1vB,EAJP8rB,GAAgB8C,EAbjC,IACC,IAgB4CrqB,KAAKhD,YAAYA,cAI7E,GE5BA,MAAMouB,GAAiB,CACnB,QACA,cACA,eACA,mBACA,QACA,UACA,SACA,aACA,SACA,UACA,UACA,QACA,UACA,UACA,iBACA,gBACA,aACA,UACA,cACA,eACA,UACA,UACA,mBACA,gBACA,QACA,aACA,MACA,YACA,YACA,yBACA,WACA,SACA,UACA,YACA,YACA,SACA,cACA,eACA,QACA,eACA,QACA,OACA,SACA,gBACA,iBACA,sBACA,UACA,eACA,oBACA,aACA,SACA,YACA,SACA,cACA,YACA,SACA,WACA,SACA,WACA,WACA,WACA,UACA,WACA,UACA,SACA,cACA,YACA,WACA,YACA,SACA,mBACA,WACA,QACA,cACA,eACA,WACA,OACA,kBACA,aACA,SACA,UACA,QACA,kBACA,gBACA,eACA,SACA,eACA,UACA,aAGIC,GAAY,CAAC,YAAa,aAAc,SAkChD,SAASC,GAAkBlW,EAAsCG,GAC7D,IAAKH,EACD,MAAM,IAAIve,MAAM,gCAIpB,OADAue,EAAIG,KAAO,QAAQA,IACZH,EAAImW,YAFU,cAEQlW,KACjC,CC5HA,SAASmW,KACL,MAAM3qB,EAAS1I,SAAS8J,cAAc,UAChCC,EAAKrB,EAAOsB,WAAW,UAAYtB,EAAOsB,WAAW,sBAE3D,GAAID,GAAM,iBAAkBA,EACxB,IAEI,MAAMV,GAAUU,EAAGK,aAAaL,EAAGoN,SAAW,IAAItS,WAGlD,IAAI/G,EAA6B,CAC/BuL,OAAQA,EACRY,UAJgBF,EAAGK,aAAaL,EAAGqN,WAAa,IAAIvS,WAKpDoV,SAAUlQ,EAAGK,aAAaL,EAAG6V,UAAY,IAAI/a,WAC7CyuB,wBAAyBvpB,EAAGK,aAAaL,EAAGwpB,2BAA6B,IAAI1uB,YAK/E,MAAMqF,EAAYH,EAAGI,aAAa,6BAClC,GAAID,EAAW,CACX,MAAMspB,GAAkBzpB,EAAGK,aAAaF,EAAUG,wBAA0B,IAAIxF,WAC1E4uB,GAAoB1pB,EAAGK,aAAaF,EAAUI,0BAA4B,IAAIzF,WAGhF2uB,IACA11B,EAAO01B,eAAiBA,GAExBC,IACA31B,EAAO21B,iBAAmBA,EAElC,CAEA,OAAO31B,CACX,CAAE,MAAOyD,GAET,CAEJ,MAAO,WACX,CAEA,SAASmyB,KACP,MAAMpkB,EAAI,IAAImhB,aAAa,GACrBkD,EAAK,IAAIrvB,WAAWgL,EAAE3L,QAI5B,OAHA2L,EAAE,GAAKskB,IACPtkB,EAAE,GAAKA,EAAE,GAAKA,EAAE,GAETqkB,EAAG,EACZ,CCpCM,SAAUE,GAAwC9hB,EAA+BvM,GACnF,MAAM1H,EAAiC,CAAA,EASvC,OAPA0H,EAAKgB,QAAS5E,IACZ,MACMkyB,EAhCZ,SAA2B/hB,GACvB,GAAmB,IAAfA,EAAI9T,OACN,OAAO,KAGT,MAAM4xB,EAA0C,CAAA,EAGhD9d,EAAIvL,QAASutB,IACX,MAAMnyB,EAAMwJ,OAAO2oB,GACnBlE,EAAajuB,IAAQiuB,EAAajuB,IAAQ,GAAK,IAGjD,IAAIkuB,EAAoB/d,EAAI,GACxBiiB,EAAmB,EAUvB,OAPA9uB,OAAOM,KAAKqqB,GAAcrpB,QAAS5E,IAC7BiuB,EAAajuB,GAAOoyB,IACtBlE,EAAeluB,EACfoyB,EAAmBnE,EAAajuB,MAI7BkuB,CACT,CAOoCmE,CADXliB,EAAIpN,IAAKiC,GAAShF,KAAOgF,EAAMA,EAAIhF,QAAO8E,GAAYrB,OAAQc,QAAgBO,IAARP,IAEvF2tB,IACFh2B,EAAO8D,GAAOkyB,KAGXh2B,CACT,CClCF,IAAIo2B,GCwCI,SAAUthB,GAAYlN,GAC1B,OAAOA,EAAOmN,OAAe,CAACC,EAAKvU,IAAUuU,GAAOvU,EAAQ,EAAI,GAAI,EACtE,UC+Bc41B,KAEd,MAAMjnB,EAAItK,OAGV,OACEgQ,GAAY,CACV,kBAAmB1F,EACnB,sBAAuBA,EACvB,YAAaA,EACiB,IAPxB3D,UAOJF,OAAO7K,QAAQ,SACjB,aAAc0O,EACd,oBAAqBA,KACjB,CAEV,UAiCgBknB,KAMd,MAAMlnB,EAAItK,OAEV,OCvHiCyxB,EDyHdnnB,EAAEonB,MCxHZ,yCAAyC7hB,KAAKrH,OAAOipB,KD0HE,8BAA9DjpB,OAAQ8B,EAAyCmR,SC3H7C,IAA2BgW,CD6HnC,UAQgBE,KACd,MAAMrnB,EAAItK,OAGV,OACEgQ,GAAY,CACV,YAAarJ,UACb,kBAAoBvJ,SAAS8V,iBAAiBC,OAAS,CAAA,GACvD,0BAA2B7I,EAC3B,oBAAqBA,EACrB,uBAAwBA,EACxB,6BAA8BA,KAC1B,CAEV,UAuIgBsnB,KACd,MAAMxe,aAnPN,MAAM9I,EAAItK,OACJ/E,EAAI0L,UAEV,OACEqJ,GAAY,CACV,4BAA6B/U,EAC7B,2BAA4BA,EACW,KAAtCA,EAAEwL,QAAU,IAAI7K,QAAQ,UACzB,oCAAqC0O,EACrC,mBAAoBA,EACpB,sBAAuBA,EACvB,wBAAyBA,KACrB,CAEV,CAqOuBunB,GACfxe,EAAYse,KACZrnB,EAAItK,OACJ/E,EAAI0L,UAGV,OAAIyM,EAEApD,GAAY,GACR,iBAAkB1F,KAKlB,WAAY,IAAIwnB,UACd,IAECze,GACFrD,GAAY,CAAC,wBAAyB1F,EAAG,gBAAiBA,EAAG,WAAWuF,KAAK5U,EAAEoV,eAAiB,CAM3G,CLpLwB,WAApB8G,MACArX,EAAiB,QA1CP,WAEV,OAAO,IAAIoD,QAAQ,CAACM,EAASoE,KACzB,KDvGDhK,eAA+B8R,GAElC,MAAQtS,SAASiB,YACT8wB,GAAK,IAEb,MAAM4C,EAAS30B,SAAS8J,cAAc,UACtC6qB,EAAOC,aAAa,cAAe,KAEnC,MAAM7e,EAAQ4e,EAAO5e,MACrBA,EAAM8e,YAAY,WAAW,SAC7B9e,EAAM8e,YAAY,UAAW,QAAS,aACtC9e,EAAM8e,YAAY,aAAc,WAChC9e,EAAM8e,YAAY,SAAU,KAC5B9e,EAAM8e,YAAY,UAAU,KAE5BF,EAAOlY,IAAM,cACbzc,SAASiB,KAAK6zB,YAAYH,GAE1B,MAAMI,EAAiBJ,EAAOK,iBAAmBL,EAAOM,eAAej1B,SACvE,IAAK+0B,EACH,MAAM,IAAIr2B,MAAM,qCAIlB4T,EAAS,CAAEqiB,OAAQI,IAGnB1uB,WAAW,KACTrG,SAASiB,KAAKi0B,YAAYP,IACzB,EACL,CC2EUQ,CAAgB30B,OAASm0B,aAErB,MACM1X,EADS0X,EAAO7qB,cAAc,UACjBE,WAAW,MAExBorB,EAA0BlC,GAAUvuB,IAAKyY,GACpC+V,GAAkBlW,EAAKG,IAGlC,IAAIiY,EAA8B,CAAA,EAClCpC,GAAezsB,QAAS4W,IACpB,MAAMkY,EAAYnC,GAAkBlW,EAAKG,GACpCgY,EAAcrzB,SAASuzB,KACxBD,EAAQjY,GAAQkY,KAGxBlvB,EAAQivB,IAIhB,CAAE,MAAO9zB,GACLiJ,EAAO,CAACjJ,MAAS,eACrB,GAER,GChEAmB,EAAiB,WA/DjB,WACE,OAAO,IAAIoD,QAASM,IAClB,MAAMmvB,EAAc3yB,OAAOuK,aAAgBvK,OAAOuK,YAAoBC,OAAYxK,OAAOuK,YAAoBC,OAAS,EACtHhH,EACE,CACEovB,UAAanC,KACboC,aAAgB/B,KAChBrmB,gBAAmBkoB,EAAWloB,iBAAmB,KAIzD,GMOA3K,EAAiB,UAlBjB,WACE,OAAO,IAAIoD,QAASM,IAClBA,EACE,CACEyN,UAOGtK,UAAU+N,SANboe,SAUG3sB,KAAKC,iBAAiBC,kBAAkBC,YAPnD,GJiDAxG,EAAiB,cA5BFlC,iBAzBX0zB,GAAkBhyB,GAASyzB,sBAAwB,CAC/C,gBACA,gBAAiB,uBACjB,uBACA,mBACA,kBACA,YACA,iBACA,kBACA,cACA,kBACA,YACA,cACA,eACA,OACA,MAAO,gBACP,kBACA,qBACA,UAAW,iBACX,2BACA,oBACA,SAMJ,MAAMC,EAAoDnxB,MAAMC,KAAK,CAACzG,OAAQiE,GAAS2zB,SAAW,GAAI,IAO1Gr1B,iBAEI,MAAMoX,EAA8C,CAAA,EAEpD,IAAK,MAAMke,KAAW5B,GAClB,IAEI,MAAM1yB,QAAe+H,UAAUnB,YAAY0P,MAAM,CAAEvY,KAAMu2B,IAGzDle,EAAiBke,GAAWt0B,EAAOyP,MAAMpM,UAC7C,CAAE,MAAOtD,GAET,CAGJ,OAAOqW,CACX,CAxBgHme,IAC5G,OAAOjwB,QAAQC,IAAI6vB,GAAoB1pB,KAAM8pB,GACtBnC,GAAwCmC,EAAqB9B,IAGxF,GK1BAxxB,EAAiB,SAVjB,WACI,OAAO,IAAIoD,QAASM,IAChBA,EACI,CACI6vB,WAAc5tB,OAAO4tB,cAIrC,GCkCAvzB,EAAiB,mBA7BFlC,iBACb,OAAI2zB,iBJoNJ,MAAMjnB,EAAItK,OACJ/E,EAAI0L,WACJqT,IAAEA,EAAGsZ,kBAAEA,GAAsBhpB,EAEnC,OACE0F,GAAY,GACR,sBAAuB/U,GACzBq4B,GAAqB,YAAaA,EAAkB3nB,UACpD,wBAAyBrB,EACzB0P,EAAIC,SAAS,mCACbD,EAAIC,SAAS,iCACT,CAEV,CIjOoBsZ,IAAwB/B,KACjC,cAaT,MAAMgC,EAAI/tB,OAKJguB,EAAkB93B,GLKlB,SAA2BA,EAAU+3B,GACzC,MAAwB,iBAAV/3B,GAAsBg4B,MAAMh4B,GAAS+3B,EAAc/3B,CACnE,CKP2Ci4B,CLNrC,SAAgBj4B,GACpB,OAAOuM,SAASvM,EAClB,CKIsDk4B,CAAMl4B,GAAQ,MAC9Dm4B,EAAa,CACjBL,EAAeD,EAAElZ,OACjBmZ,EAAeD,EAAEjZ,SAGnB,OADAuZ,EAAWC,OAAOC,UACXF,CACT,CAtBSG,EACT,GChBA,MAAM/E,GAA+B,8BtB0wBnC,GAAyB,oBAAdvoB,UACT,MAAO,CACLhK,KAAM,UACN0a,QAAS,WAGb,MAAMrM,EAAKrE,UAAUsE,UAEfipB,EAAU,CAEd,+CAEA,kFAEA,4EAEA,6CAEA,6DAEA,gDAEA,qDAEA,yDAIIC,EAA4C,CAChDC,IAAK,OACLlc,IAAK,QACLmc,QAAS,kBAIX,IAAK,MAAM1R,KAASuR,EAAS,CAC3B,MAAMhpB,EAAQF,EAAGE,MAAMyX,GACvB,GAAIzX,GAASA,EAAMopB,OAAQ,CAKzB,MAAO,CACL33B,KAHAw3B,EAAejpB,EAAMopB,OAAO33B,KAAK2W,gBAAkBpI,EAAMopB,OAAO33B,KAIhE0a,QAASnM,EAAMopB,OAAOjd,QAE1B,CACF,CAGA,MAAO,CACL1a,KAAM,UACN0a,QAAS,UAEb,CsBh0BeyQ,GAAanrB,KAA6B,EAAI,EAC7D,IAAImJ,GACAqB,GAAmC,KAWhCvJ,eAAe22B,KARI,oBAAbn3B,WACT0I,GAAS1I,SAAS8J,cAAc,UAChCpB,GAAOwU,MAAQ,IACfxU,GAAOyU,OAAS,IAChBpT,GAAKrB,GAAOsB,WAAW,UAOzB,IAEE,IAAKD,GACD,MAAM,IAAIrL,MAAM,uBAIpB,MAAMwzB,EAA0BztB,MAAMC,KAAK,CAACzG,OAAQ6zB,IAAQ,IAahE,WACE,IAEI,IAAK/nB,GACD,MAAM,IAAIrL,MAAM,uBAGpB,MAAM04B,EAAqB,4IAOrBC,EAAuB,uKAOvBC,EAAevtB,GAAGwtB,aAAaxtB,GAAGytB,eAClCC,EAAiB1tB,GAAGwtB,aAAaxtB,GAAG2tB,iBAE1C,IAAKJ,IAAiBG,EAClB,MAAM,IAAI/4B,MAAM,4BAOpB,GAJAqL,GAAG4tB,aAAaL,EAAcF,GAC9BrtB,GAAG4tB,aAAaF,EAAgBJ,GAEhCttB,GAAG6tB,cAAcN,IACZvtB,GAAG8tB,mBAAmBP,EAAcvtB,GAAG+tB,gBACxC,MAAM,IAAIp5B,MAAM,qCAAuCqL,GAAGguB,iBAAiBT,IAI/E,GADAvtB,GAAG6tB,cAAcH,IACZ1tB,GAAG8tB,mBAAmBJ,EAAgB1tB,GAAG+tB,gBAC1C,MAAM,IAAIp5B,MAAM,uCAAyCqL,GAAGguB,iBAAiBN,IAGjF,MAAMO,EAAgBjuB,GAAGkuB,gBAEzB,IAAKD,EACD,MAAM,IAAIt5B,MAAM,mCAMpB,GAHAqL,GAAGmuB,aAAaF,EAAeV,GAC/BvtB,GAAGmuB,aAAaF,EAAeP,GAC/B1tB,GAAGouB,YAAYH,IACVjuB,GAAGquB,oBAAoBJ,EAAejuB,GAAGsuB,aAC1C,MAAM,IAAI35B,MAAM,kCAAoCqL,GAAGuuB,kBAAkBN,IAG7EjuB,GAAGwuB,WAAWP,GAGd,MAAMQ,EAAoB,IACpBC,EAAW,IAAIhI,aAAyB,EAAZ+H,GAC5BE,EAAkB,EAAI36B,KAAK46B,GAAMH,EAEvC,IAAK,IAAIv0B,EAAI,EAAGA,EAAIu0B,EAAWv0B,IAAK,CAChC,MAAM20B,EAAQ30B,EAAIy0B,EAGlBD,EAAa,EAAJx0B,GAAS,EAClBw0B,EAAa,EAAJx0B,EAAQ,GAAK,EACtBw0B,EAAa,EAAJx0B,EAAQ,GAAKlG,KAAK86B,IAAID,IAAUlwB,GAAOwU,MAAQ,GACxDub,EAAa,EAAJx0B,EAAQ,GAAKlG,KAAK+6B,IAAIF,IAAUlwB,GAAOyU,OAAS,EAC7D,CAEA,MAAM4b,EAAehvB,GAAGivB,eACxBjvB,GAAGkvB,WAAWlvB,GAAGmvB,aAAcH,GAC/BhvB,GAAGovB,WAAWpvB,GAAGmvB,aAAcT,EAAU1uB,GAAGqvB,aAE5C,MAAMC,EAAoBtvB,GAAGuvB,kBAAkBtB,EAAe,YAC9DjuB,GAAGwvB,wBAAwBF,GAC3BtvB,GAAGyvB,oBAAoBH,EAAmB,EAAGtvB,GAAG0vB,OAAO,EAAO,EAAG,GAGjE1vB,GAAG2vB,SAAS,EAAG,EAAGhxB,GAAOwU,MAAOxU,GAAOyU,QACvCpT,GAAG4vB,WAAW,EAAK,EAAK,EAAK,GAC7B5vB,GAAG6vB,MAAM7vB,GAAG8vB,kBACZ9vB,GAAG+vB,WAAW/vB,GAAGgwB,MAAO,EAAe,EAAZvB,GAE3B,MAAMwB,EAAY,IAAIrK,kBAAkBjnB,GAAOwU,MAAQxU,GAAOyU,OAAS,GACvEpT,GAAGkwB,WAAW,EAAG,EAAGvxB,GAAOwU,MAAOxU,GAAOyU,OAAQpT,GAAGmwB,KAAMnwB,GAAGowB,cAAeH,GAG5E,OAFkB,IAAIpK,UAAUoK,EAAWtxB,GAAOwU,MAAOxU,GAAOyU,OAGpE,CAAE,MAAO5b,GAEL,OAAO,IAAIquB,UAAU,EAAG,EAC5B,SACM7lB,KAEFA,GAAGkvB,WAAWlvB,GAAGmvB,aAAc,MAC/BnvB,GAAGwuB,WAAW,MACdxuB,GAAG2vB,SAAS,EAAG,EAAG3vB,GAAGqwB,mBAAoBrwB,GAAGswB,qBAC5CtwB,GAAG4vB,WAAW,EAAK,EAAK,EAAK,GAEjC,CACF,CAnHsEW,IAKlE,MAAO,CACLC,gBAAmBj3B,EAJG8rB,GAAgB8C,EAAYxpB,GAAOwU,MAAOxU,GAAOyU,QAI/BtV,KAAKhD,YAAYA,WAE7D,CAAE,MAAOtD,GACP,MACF,CACF,CCmBA,SAASi5B,KACL,GAAiC,WAA7B53B,OAAO63B,SAASC,UAAoE,mBAAnC93B,OAAe+3B,gBAChE,IACI,MAAMC,EAAgBh4B,OAAe+3B,gBAAgBE,gBACrD,IAAK,IAAI52B,EAAI,GAAIA,EAAI,EAAGA,IACpB,GAAI22B,EAAa32B,GACb,OAAOA,CAGnB,CAAE,MAAO1C,GACL,OAAO,CACX,CAEJ,OAAO,CACX,CCqOAmB,EAAiB,QA9NVlC,gBACLs6B,MAAEA,EAAQ,CAAA,GAAgB,CAAEA,MAAO,CAAA,IAEnC,MAAM/wB,EAuIF,SAA0B+wB,GAC9B,GAAIA,EAAMC,MACR,OAAOD,EAAMC,MAAMC,QAGrB,MAAMtyB,EAAS1I,SAAS8J,cAAc,UACtC,IAAIkxB,EAEJtyB,EAAOtI,iBACL,0BACA,IAAO46B,OAAUt0B,GAGnB,IAAK,MAAM6N,IAAQ,CAAC,QAAS,sBAAuB,CAClD,IACEymB,EAAUtyB,EAAOsB,WAAWuK,EAC9B,CAAE,MAEF,CACA,GAAIymB,EACF,KAEJ,CAGA,OADAF,EAAMC,MAAQ,CAAEC,WACTA,CACT,CAjKaC,CAAgBH,GAC3B,IAAK/wB,EACH,MAAO,CAAEvI,QAnDuB,GAsDlC,IAkNF,SAAgCuI,GAC9B,MAAkC,mBAApBA,EAAGK,YACnB,CApNO8wB,CAAuBnxB,GAC1B,MAAO,CAAEvI,QArDsC,GAwDjD,MAAM25B,EAgMC5G,KA/LH,KACAxqB,EAAGI,aApByB,6BAsB1BixB,QAAkBjE,KAExB,MAAO,CACLld,QAASlQ,EAAGK,aAAaL,EAAG6V,UAAU/a,YAAc,GACpDwE,OAAQU,EAAGK,aAAaL,EAAGoN,SAAStS,YAAc,GAClD2uB,eAAgB2H,EACZpxB,EAAGK,aAAa+wB,EAAe9wB,wBAAwBxF,WACvD,GACJoF,SAAUF,EAAGK,aAAaL,EAAGqN,WAAWvS,YAAc,GACtD4uB,iBAAkB0H,EACdpxB,EAAGK,aAAa+wB,EAAe7wB,0BAA0BzF,WACzD,GACJyuB,uBACEvpB,EAAGK,aAAaL,EAAGwpB,2BAA2B1uB,YAAc,MAC3Du2B,EAEP,GC1FE14B,EAAiB,UAnBL,WACV,MAAM8T,EAAoB,GAE1B,GAAIjN,UAAUiN,QACZ,IAAK,IAAIvS,EAAI,EAAGA,EAAIsF,UAAUiN,QAAQvY,OAAQgG,IAAK,CACjD,MAAMyZ,EAASnU,UAAUiN,QAAQvS,GACjCuS,EAAQnG,KAAK,CAACqN,EAAOne,KAAMme,EAAO2d,SAAU3d,EAAO4d,aAAcv2B,KAAK,KACxE,CAGF,OAAO,IAAIe,QAASM,IAClBA,EACE,CACEoQ,QAAWA,KAInB,GFuDF9T,EAAiB,SAvEjBlC,iBACI,OAAO,IAAIsF,QAASM,IAEhB,MAAMm1B,EAAiBvhB,KAEvB5T,EAAQ,CACJqlB,SAAY7oB,OAAO2G,UAAUkiB,SAC7B+P,cAAiB54B,OAAO2G,UAAUiyB,cAClC/lB,WAAclM,UAAUkM,WACxBgmB,QAAWlyB,UAAUkyB,QACrBpd,QAAW,CACP9e,KAAQg8B,EAAeh8B,MAE3Bm8B,gBAAmBlB,QAG/B,GGZA,MAAMmB,GAAc,CAChB,KACA,cACA,OACA,KACA,KACA,KACA,SACA,OACA,KACA,SAMEC,GAAa,CACf,oBACA,iBACA,kBACA,mBACA,gBACA,WACA,kBACA,cASJ,SAASC,GAAoBC,EAAeC,GACxC,IAEI,MAAMrzB,EAAS1I,SAAS8J,cAAc,UAChCkyB,EAAO,GACbtzB,EAAOwU,MAAQ8e,EACftzB,EAAOyU,OAAS6e,EAEhB,MAAM/e,EAAMvU,EAAOsB,WAAW,MAC9B,OAAKiT,GAGLA,EAAIqV,UAAY,QAChBrV,EAAIsV,SAAS,EAAG,EAAGyJ,EAAMA,GAGzB/e,EAAII,aAAe,SACnBJ,EAAIgf,UAAY,SAChBhf,EAAIqV,UAAY,QAChBrV,EAAIG,KAAO,SAAS2e,KACpB9e,EAAIK,SAASwe,EAAOE,EAAO,EAAGA,EAAO,GAG9B/e,EAAIO,aAAa,EAAG,EAAGwe,EAAMA,GAAMn0B,MAdzB,IAerB,CAAE,MAAOxF,GACL,OAAO,IACX,CACJ,CAOA,SAAS65B,GAAkBC,GAEvB,MAAMC,EAAuB,GAE7B,IAAK,IAAIn4B,EAAI,EAAGA,EAAIk4B,EAAOl+B,OAAQgG,GAAK,GAEpCm4B,EAAW/rB,KAAK8rB,EAAOl4B,GAAIk4B,EAAOl4B,EAAI,GAAIk4B,EAAOl4B,EAAI,IAGzD,OAAOm4B,CACX,CAiDA15B,EAAiB,mBA3CjBlC,iBACI,OAAO,IAAIsF,QAASM,IAChB,IACI,MAAMivB,EAAkC,CAAA,EACxC,IAAIgH,EAAyB,GAG7BV,GAAYn1B,QAAQ,CAACs1B,EAAOr1B,KAExB,IAAK,MAAM2W,KAAQwe,GAAY,CAC3B,MAAM5B,EAAY6B,GAAoBC,EAAO1e,GAE7C,GAAI4c,EAAW,CACX,MAAMoC,EAAaF,GAAkBlC,GACrCqC,EAAe,IAAIA,KAAiBD,GAGpC/G,EAAQ,SAAS5uB,KAAWnD,EAAK,IAAIgB,WAAW83B,GAAYz4B,QAAQjG,MAAM,EAAG,IAC7E,KACJ,CACJ,IAMJ0I,EAAQ,CACJk2B,qBAHiBh5B,EAAK,IAAIgB,WAAW+3B,GAAc14B,QAInD44B,aAAclH,EACdmH,qBAAsBt3B,OAAOM,KAAK6vB,GAASp3B,QAEnD,CAAE,MAAOoE,GAEL+D,EAAQ,CACJk2B,qBAAsB,cACtBC,aAAc,CAAA,EACdC,qBAAsB,GAE9B,GAER,GChIA,MA0BMC,GAAY,CAACntB,EAA0BotB,EAAWtuB,EAAWvQ,KAC/D,MAAM8+B,GAAKvuB,EAAIsuB,GAAK7+B,EACpB,IAAIiV,EAAM,EACV,IAAK,IAAI7O,EAAI,EAAGA,EAAIpG,EAAGoG,IAAK,CAExB6O,GAAOxD,EADGotB,GAAKz4B,EAAI,IAAO04B,EAE9B,CACA,OAAO7pB,EAAM6pB,GCjCX,SAAU5K,GAAeC,EAAoBC,GACjD,OAAO,IAAInsB,QAASM,GAAYC,WAAWD,EAAS4rB,EAAYC,GAClE,CCsFM,SAAU2K,GAAkBC,GAChC,MAAOC,EAAKC,Gb1BN,SACJF,GAEA,MAAMG,EAAe,sBAAsBH,KACrCI,EAAW,sBAAsBzX,KAAKqX,GACtCC,EAAMG,EAAS,SAAMv2B,EACrBq2B,EAAuC,CAAA,EACvCG,EAAa,0BAEbC,EAAe,CAAC59B,EAAchB,KAClCw+B,EAAWx9B,GAAQw9B,EAAWx9B,IAAS,GACvCw9B,EAAWx9B,GAAM8Q,KAAK9R,IAGxB,OAAS,CACP,MAAMuP,EAAQovB,EAAW1X,KAAKyX,EAAS,IACvC,IAAKnvB,EACH,MAEF,MAAMsvB,EAAOtvB,EAAM,GACnB,OAAQsvB,EAAK,IACX,IAAK,IACHD,EAAa,QAASC,EAAK1/B,MAAM,IACjC,MACF,IAAK,IACHy/B,EAAa,KAAMC,EAAK1/B,MAAM,IAC9B,MACF,IAAK,IAAK,CACR,MAAM2/B,EAAiB,yDAAyD7X,KAAK4X,GACrF,IAAIC,EAGF,MAAM,IAAI3+B,MAAMs+B,GAFhBG,EAAaE,EAAe,GAAIA,EAAe,IAAMA,EAAe,IAAM,IAI5E,KACF,CACA,QACE,MAAM,IAAI3+B,MAAMs+B,GAEtB,CAEA,MAAO,CAACF,EAAKC,EACf,CahB0BO,CAAuBT,GAC3C9I,EAAU/zB,SAAS8J,cAAcgzB,GAAO,OAC9C,IAAK,MAAMv9B,KAAQ2F,OAAOM,KAAKu3B,GAAa,CAC1C,MAAMx+B,EAAQw+B,EAAWx9B,GAAMwF,KAAK,KAGvB,UAATxF,EACFg+B,GAAexJ,EAAQhe,MAAOxX,GAE9Bw1B,EAAQa,aAAar1B,EAAMhB,EAE/B,CACA,OAAOw1B,CACT,CAKM,SAAUwJ,GAAexnB,EAA4BynB,GAGzD,IAAK,MAAMC,KAAYD,EAAO7lB,MAAM,KAAM,CACxC,MAAM7J,EAAQ,8CAA8C0X,KAAKiY,GACjE,GAAI3vB,EAAO,CACT,OAASvO,EAAMhB,EAAK,CAAIm/B,GAAY5vB,EACpCiI,EAAM8e,YAAYt1B,EAAMhB,EAAOm/B,GAAY,GAC7C,CACF,CACF,CCzDA,SAASC,GAAUp/B,GACjB,OAAOq/B,WAAW,mBAAmBr/B,MAAU+mB,OACjD,CH1BA5iB,EAAiB,OApCGlC,UACT,CACHq9B,KAAM9/B,KAAK8/B,KAAK,IAChBC,KAAMrB,GAAU1+B,KAAK+/B,MAAM,EAAI,EAAG,IAClCC,KAAMtB,GAAU1+B,KAAKggC,MAAM,EAAI,EAAG,IAClClF,IAAK4D,GAAU1+B,KAAK86B,IAAK,EAAG96B,KAAK46B,GAAI,IACrCqF,KAAMjgC,KAAKigC,KAAK,EAAE,GAClB37B,EAAGtE,KAAKkgC,EACRC,SAAUngC,KAAK86B,IAAI,MACnBsF,SAAUpgC,KAAK+6B,IAAI,MACnBsF,SAAUrgC,KAAKsgC,IAAI,MACnBC,IAAKvgC,KAAKugC,IAAI,KACdC,GAAIxgC,KAAK46B,GACTG,IAAK2D,GAAU1+B,KAAK+6B,KAAM/6B,KAAK46B,GAAI56B,KAAK46B,GAAI,IAC5C6F,KAAM/B,GAAU1+B,KAAKygC,MAAM,EAAG,EAAG,EAAE,EAAG,IACtCC,KAAM1gC,KAAK0gC,KAAK,GAChBJ,IAAK5B,GAAU1+B,KAAKsgC,IAAK,EAAG,EAAItgC,KAAK46B,GAAI,IACzC+F,KAAMjC,GAAU1+B,KAAK2gC,MAAM,EAAG,EAAG,EAAE,EAAG,OGqiB9C,SAASC,GAAU5K,GACjBA,EAAQhe,MAAM8e,YAAY,aAAc,SAAU,aAClDd,EAAQhe,MAAM8e,YAAY,UAAW,QAAS,YAChD,CAEAnyB,EAAiB,cA/EjBlC,iBACE,IAyBO2zB,OAAcK,KAxBnB,OAGF,MAAMoK,aArUN,MAAMC,EAAUC,KAEhB,MAAO,CACLC,QAAS,CACP,kBACA,mBACA,wBACA,wBACAF,EAAQ,yBAEVG,MAAO,CACL,YACA,iBACAH,EAAQ,oBACR,2BACA,UAEFI,eAAgB,CACd,cACAJ,EAAQ,oBACR,aACAA,EAAQ,wCACRA,EAAQ,yDAEVK,eAAgB,CACd,oBACA,QACA,uBACA,YACAL,EAAQ,qDAEVM,sBAAuB,CACrB,oBACA,kBACA,qBACAN,EAAQ,4BACRA,EAAQ,qBAEVO,kBAAmB,CACjB,aACA,oBACA,yBACA,UACA,iDAEFC,YAAa,CACX,sBACAR,EAAQ,oBACRA,EAAQ,wBACRA,EAAQ,4BACRA,EAAQ,qBAEVS,eAAgB,CACdT,EAAQ,oBACRA,EAAQ,oCACR,eACAA,EAAQ,oCACRA,EAAQ,qCAEVU,cAAe,CACb,WACAV,EAAQ,gCACR,mBACA,aACAA,EAAQ,iBAEVW,cAAe,CAAC,uCAChBC,gBAAiB,CACf,eACAZ,EAAQ,wDACRA,EAAQ,gCACRA,EAAQ,gBACRA,EAAQ,6BAEVa,cAAe,CACbb,EAAQ,oBACRA,EAAQ,gBACR,0BACA,gBACAA,EAAQ,yBAEVc,eAAgB,CACdd,EAAQ,oDACRA,EAAQ,gBACR,yBACAA,EAAQ,oCACR,qBAEFe,cAAe,CACbf,EAAQ,gEACRA,EAAQ,oDACR,cACA,eACA,iBAEFgB,yBAA0B,CACxB,oBACA,eACA,iBACA,cACA,cAEFC,0BAA2B,CACzB,eACAjB,EAAQ,oDACRA,EAAQ,gEACRA,EAAQ,oDACR,kBAEFkB,eAAgB,CACd,aACAlB,EAAQ,gBACRA,EAAQ,wDACRA,EAAQ,wDACRA,EAAQ,yDAEVmB,UAAW,CACTnB,EAAQ,gCACR,iBACA,kBACA,sBAEFoB,SAAU,CACR,cACApB,EAAQ,gCACRA,EAAQ,4BACR,mBACAA,EAAQ,iCAEVqB,cAAe,CACbrB,EAAQ,wDACRA,EAAQ,wBACR,YACA,kBACA,cAEFsB,eAAgB,CACd,gBACA,oBACA,uBACAtB,EAAQ,4BACR,6BAEFuB,oBAAqB,CACnB,oBACAvB,EAAQ,wBACRA,EAAQ,4BACR,SACAA,EAAQ,iCAEVwB,cAAe,CACbxB,EAAQ,oBACRA,EAAQ,oCACR,YACAA,EAAQ,oDACR,sBAEFyB,gBAAiB,CACf,oBACAzB,EAAQ,4BACRA,EAAQ,oBACRA,EAAQ,gCACRA,EAAQ,6CAEV0B,cAAe,CACb1B,EAAQ,4BACR,4BACAA,EAAQ,4DACRA,EAAQ,oDACRA,EAAQ,iEAEV2B,kBAAmB,CACjB3B,EAAQ,4BACRA,EAAQ,4BACRA,EAAQ,4CACRA,EAAQ,gDACRA,EAAQ,iDAEV4B,SAAU,CAAC5B,EAAQ,qDACnB6B,iBAAkB,CAChB,iBACA,mBACA,mBACA,qBACA,aAEFC,mBAAoB,CAAC,oCACrBC,uBAAwB,CACtB,kBACA,oDACA,mBACA,kEACA,mBAEFC,aAAc,CACZ,YACA,kBACA,iBACA,kBACA,2BAEFC,gBAAiB,CACfjC,EAAQ,4DACRA,EAAQ,gDACR,6BACAA,EAAQ,oBACR,gBAEFkC,aAAc,CACZlC,EAAQ,gDACRA,EAAQ,4DACRA,EACE,oEAEF,gBACA,kBAEFmC,UAAW,CACT,cACA,6BACAnC,EAAQ,gBACRA,EAAQ,gCACR,mBAEFoC,sBAAuB,CACrB,gDACA,iCACA,yBACA,yBACA,oBAEFC,aAAc,CACZrC,EACE,qEAGJsC,QAAS,CACPtC,EACE,4KAGFA,EACE,6KAIJuC,OAAQ,CACNvC,EAAQ,gDACRA,EAAQ,4BACRA,EAAQ,gDACRA,EAAQ,wBACR,4BAEFwC,QAAS,CACPxC,EAAQ,oBACR,2BACAA,EAAQ,oCACRA,EAAQ,gCACRA,EAAQ,yDAEVyC,QAAS,CACPzC,EAAQ,oDACRA,EAAQ,oCACRA,EAAQ,gDACR,yBACA,mCAEF0C,eAAgB,CACd,8BACA1C,EAAQ,gDACRA,EACE,wEAEFA,EAAQ,gEACRA,EAAQ,yBAEV2C,GAAI,CACF3C,EAAQ,4DACRA,EACE,oEAEFA,EACE,4EAEFA,EAAQ,oDACR,oBAEF4C,KAAM,CACJ5C,EAAQ,oCACRA,EAAQ,oCACRA,EAAQ,wCACR,WACA,qBAEF6C,QAAS,CACP,2BACA7C,EAAQ,oDACRA,EAAQ,gBACR,QACA,eAEF8C,uBAAwB,CACtB,sBACA,gBACA9C,EAAQ,4BACR,qBACA,2BAGN,CAgBkB+C,GACVC,EAAc38B,OAAOM,KAAKo5B,GAC1BkD,EAAgB,GAAgBlxB,UACjCixB,EAAYl9B,IAAKo9B,GAAenD,EAAQmD,KAEvCC,QAmBRxhC,eACEyhC,GAEA,MAAM9zB,EAAInO,SACJkiC,EAAO/zB,EAAErE,cAAc,OACvBq4B,EAAW,IAAI19B,MAAmBw9B,EAAUhkC,QAC5C+jC,EAAwC,CAAA,EAE9CrD,GAAUuD,GAIV,IAAK,IAAIj+B,EAAI,EAAGA,EAAIg+B,EAAUhkC,SAAUgG,EAAG,CACzC,MAAM8vB,EAAU6I,GAAkBqF,EAAUh+B,IACpB,WAApB8vB,EAAQqO,SACTrO,EAA8BsO,OAEjC,MAAMC,EAASn0B,EAAErE,cAAc,OAC/B60B,GAAU2D,GACVA,EAAOxN,YAAYf,GACnBmO,EAAKpN,YAAYwN,GACjBH,EAASl+B,GAAK8vB,CAChB,CAGA,MAAQ5lB,EAAElN,YACF8wB,GAAK,IAEb5jB,EAAElN,KAAK6zB,YAAYoN,GAEnB,IAEE,IAAK,IAAIj+B,EAAI,EAAGA,EAAIg+B,EAAUhkC,SAAUgG,EACjCk+B,EAASl+B,GAAGs+B,eACfP,EAAiBC,EAAUh+B,KAAM,EAGvC,SAEEi+B,EAAKM,YAAYtN,YAAYgN,EAC/B,CAEA,OAAOF,CACT,CA9DiCS,CAAoBX,GAE7CY,EAAiBb,EAAYx8B,OAAQ08B,IACzC,MAAME,EAAYrD,EAAQmD,GAI1B,OAHqBnvB,GACnBqvB,EAAUt9B,IAAKk4B,GAAamF,EAAiBnF,KAEN,GAAnBoF,EAAUhkC,SAIlC,OAFAykC,EAAe/L,OAER+L,CACT,GA0DAhgC,EAAiB,2BAzdf,MAAMigC,EAAoB,GAE1B,IAAK,MAAM/gC,IAAO,CAEhB,SAGA,SAGA,UACA,WAGA,SAGA,OACA,SAGA,cAGA,qCACA,SAGA,OAGA,YAGA,QACA,cAGA,gBAIC,CACD,MAAMrD,EAASqE,OAA8ChB,GACzDrD,GAA0B,iBAAVA,GAClBokC,EAAQtyB,KAAKzO,EAEjB,CAEA,MAAMghC,EAAsBD,EAAQhM,OAGpC,GAAIiM,EAAoB3kC,OAAS,EAC/B,OAAO2kC,EACF,CACL,MAAQrjC,KAAMsjC,GAAgB7oB,KAC9B,MAAO,CAAC6oB,EACV,CACF,GAgaAngC,EAAiB,aApfjB,WACE,GAAKk7B,WAAW,uBAAuBtY,QAAvC,CAOA,IAAK,IAAIrhB,EAAI,EAAGA,GAjBM,MAiBkBA,EACtC,GAAI25B,WAAW,oBAAoB35B,MAAMqhB,QACvC,OAAOrhB,EAIX,MAAM,IAAIvF,MAAM,iBAVhB,CAWF,GAseAgE,EAAiB,eA5gBjB,WACE,QAAIi7B,GAAU,YAGVA,GAAU,cAAd,CAIF,GAqgBAj7B,EAAiB,aAvhBjB,WAEE,IAAK,MAAMogC,IAAS,CAAC,UAAW,KAAM,QACpC,GAAIlF,WAAW,iBAAiBkF,MAAUxd,QACxC,OAAOwd,CAIb,GAghBApgC,EAAiB,QAtejB,WACE,OAAQ6G,UAAkBw5B,KAC5B,GAqeArgC,EAAiB,eA1iBjB,WAIE,OAD0B8xB,MAAeL,KAKpCvxB,OAAOogC,cAGL,IAAIA,cAAeC,iBAFxB,GAJA,CAOJ,GCpBO,MAAMC,GAAsB1iC,MAAO2iC,EAAoBC,KAC5D,MACEC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAnI,SACQoI,KAEV,MAAO,CACLR,aACAvc,OAAQ,CACNgd,eAAgBP,EAAY//B,KAC5BiR,KAAM,MACNuS,GAAI4c,EAAc3U,SAClB8U,WAAYJ,EAASxpB,QACrB6pB,gBAAiBT,EAAYx7B,KAC7B0zB,eAAgBA,EAChB3lB,IAAK2tB,EACLtU,UAAWyU,EAAczU,UACzBuU,UAAWA,EACXO,IAAKT,GAEPU,IAAK,CACHzkC,KAAM6jC,GAAS7jC,KACf0a,QAASmpB,GAASnpB,WAKjBzZ,eAAemjC,KACpB,aAAa79B,QAAQC,IAAI,CACvBwB,IACAsB,IACAiR,KACAvP,IACA8gB,KACA4C,KACAiB,MAEJ,CCjDA,MAAMhvB,SAAEA,GAAQC,YAAEA,GAAWE,eAAEA,IAAmBR,IAElD,MAAMokC,GAUJ,WAAAhlC,CAAYilC,EAA+B,IAJnC5kC,KAAA6kC,eAAgB,EACP7kC,KAAA8kC,OAAgC,GAChC9kC,KAAA+kC,gBAAkB,IAAIC,IAGrChlC,KAAK4kC,OAAS,IAAKD,GAAaM,kBAAmBL,GACnD/jC,IACF,CAKO,kBAAAqkC,CAAmBJ,GACNA,EAAO/+B,OACtBo/B,IAAWnlC,KAAK+kC,gBAAgB1gB,IAAI8gB,EAAMC,KAGnCl+B,QAASi+B,GAAUnlC,KAAKqlC,WAAWF,IAC7CnlC,KAAK6kC,eAAgB,CACvB,CAKA,WAAIS,GAEF,OADAtlC,KAAKulC,oBACEvlC,KAAK8kC,OAAOz/B,IAAI,EAAGovB,aAAY0Q,KAAYA,EACpD,CAKO,cAAAK,CAAeC,GAChBA,EACFzlC,KAAK0lC,oBAAoBD,GAEzBzlC,KAAK2lC,mBAET,CAIQ,UAAAN,CAAWF,GACjB,MAAMC,GAAEA,EAAEQ,IAAEA,GAAQT,EACd1Q,EAAUz0B,KAAK6lC,gBAAgBT,GAC/BU,EAAc9lC,KAAK+lC,kBAAkBX,EAAI3Q,EAASmR,GAExD5lC,KAAK8kC,OAAO/zB,KAAK+0B,GACjB9lC,KAAK+kC,gBAAgBiB,IAAIZ,GAGzB,MAAMa,EAAejmC,KAAKkmC,mBAAmBJ,GAC7CrR,EAAQ3zB,iBAAiB,QAASmlC,EACpC,CAEQ,eAAAJ,CAAgBT,GACtB,MAAM3Q,EAAU/zB,SAASylC,eAAef,GAExC,IAAK3Q,EACH,MAAM,IAAIv0B,EACR,oBAAoBklC,gGAIxB,IAAKplC,KAAKomC,oBAAoB3R,GAC5B,MAAM,IAAIv0B,EACR,oBAAoBklC,0DAIxB,OAAO3Q,CACT,CAEQ,mBAAA2R,CACN3R,GAEA,OACEA,aAAmB4R,kBACnB5R,aAAmB6R,mBAEvB,CAEQ,iBAAAP,CACNX,EACA3Q,EACAmR,GAEA,MAAO,CACLW,WAAYnB,EACZoB,WAAY,EACZC,SAAU,EACVC,kBAAmB,EACnBC,YAAa,KACbC,YAAa,EACbhB,IAAKA,IAAO,EACZiB,kBAAmB,EACnBC,OAAQ,EACRC,eAAgB,GAChBtS,UAEJ,CAEQ,kBAAAyR,CAAmBf,GACzB,OAAQ6B,IACNhnC,KAAKinC,YAAY9B,EAAO6B,GAE5B,CAEQ,WAAAC,CACNC,EACAF,GAEA,MAAM9oC,EAAM2P,YAAY3P,MAClBipC,EAAsBD,EAAaT,UAAY,EAE/CW,EAAepnC,KAAKqnC,mBACxBH,EACAF,EACA9oC,EACAipC,GAGFnnC,KAAKsnC,mBAAmBJ,EAAcE,EAAclpC,EACtD,CAEQ,kBAAAmpC,CACNlC,EACA6B,EACA9oC,EACAipC,GAEA,MAAMI,EAAavnC,KAAKwnC,oBAAoBrC,EAAO6B,GAEnD,MAAO,CACLO,aACAE,aAAcznC,KAAKynC,aAAaT,GAChCU,QAAS1nC,KAAK0nC,QAAQH,EAAYP,GAClCW,QAAS3nC,KAAK2nC,QAAQzpC,EAAKipC,GAC3BS,cAAe1pC,EAAMipC,EAEzB,CAEQ,kBAAAG,CACNnC,EACAiC,EACAlpC,GAGKinC,EAAMqB,aACTrB,EAAMqB,WAAatoC,GAGrBinC,EAAMsB,SAAWvoC,EACjBinC,EAAMwB,YAAcS,EAAaG,WACjCpC,EAAMuB,mBAAqB,EAEvBU,EAAaK,eAActC,EAAM0B,mBAAqB,GACtDO,EAAaM,UAASvC,EAAMyB,aAAe,GAC3CQ,EAAaO,UACfxC,EAAM2B,QAAU,EAChB3B,EAAM4B,eAAeh2B,KAAKq2B,EAAaQ,eAE3C,CAEQ,mBAAAJ,CACNrC,EACA6B,GAEA,MAAMa,EAAYb,EAAMa,UACxB,IAAKA,EAAW,OAAOznC,EAAS0nC,MAEhC,MAAMC,EACU,eAAdF,EACIznC,EAAS4nC,MACK,oBAAdH,EACAznC,EAAS0nC,MACT1nC,EAAS6nC,MAGf,OAAI9C,EAAMwB,aAAexB,EAAMwB,cAAgBoB,EACtC3nC,EAAS6nC,MAGXF,CACT,CAEQ,YAAAN,CAAaT,GACnB,MAA2B,0BAApBA,EAAMa,SACf,CAEQ,OAAAH,CAAQH,EAAwBP,GACtC,OACEO,IAAennC,EAAS0nC,OAA6B,oBAApBd,EAAMa,SAE3C,CAEQ,OAAAF,CAAQzpC,EAAaipC,GAC3B,GAA4B,IAAxBA,EAA2B,OAAO,EAGtC,OAD+BjpC,EAAMipC,EACLnnC,KAAK4kC,OAAOsD,gBAC9C,CAEQ,mBAAAxC,CAAoBD,GAC1B,MAAMt+B,EAAQnH,KAAK8kC,OAAOqD,UACvBhD,GAAUA,EAAMoB,aAAed,GAGlC,IAAc,IAAVt+B,EAAc,OAElB,MAAMg+B,EAAQnlC,KAAK8kC,OAAO39B,GAC1BnH,KAAKooC,qBAAqBjD,GAE1BnlC,KAAK8kC,OAAOuD,OAAOlhC,EAAO,GAC1BnH,KAAK+kC,gBAAgBuD,OAAO7C,EAC9B,CAEQ,iBAAAE,GACN3lC,KAAK8kC,OAAO59B,QAASi+B,GAAUnlC,KAAKooC,qBAAqBjD,IACzDnlC,KAAK8kC,OAAOnmC,OAAS,EACrBqB,KAAK+kC,gBAAgBzK,OACvB,CAEQ,oBAAA8N,CAAqBjD,GAG3BA,EAAM1Q,QAAQzzB,oBAAoB,QAAShB,KAAKkmC,mBAAmBf,GACrE,CAEQ,iBAAAI,GACN,IAAKvlC,KAAK6kC,cACR,MAAM,IAAI3kC,EACR,oEAGN,EAhPwBykC,GAAAM,eAA8B,CACpDiD,iBAAkB,MAmPtB,MAAMK,GAAe,IAAI5D,SCjOZ6D,GAOX,WAAA7oC,EAAY2B,OAAEA,IANGtB,KAAAyoC,UAAY1qC,IAErBiC,KAAA6kC,eAAyB,EAqDjC7kC,KAAA0oC,eAAiB,KACf,IAAK1oC,KAAK6kC,cACR,MAAM,IAAI3kC,EACR,yDAIJ,IAAKF,KAAK2oC,aACR,MAAM,IAAIzoC,EACR,0EAIJ,MAAM0oC,EDuKD,CACLC,mBAAoBjoC,KACpBkkC,OAAQyD,GAAajD,SCvKrB,MAAO,CACLwD,WAAY9oC,KAAK2oC,aAAaG,WAC9BjF,WAAY7jC,KAAK2oC,aAAa9E,WAC9BS,eAAgBtkC,KAAK2oC,aAAarE,eAClC/7B,KAAM,IAAKqgC,KAOf5oC,KAAA+oC,YAAc7nC,UACZ,MAAME,EAAUpB,KAAK0oC,iBAErB,IACE,MAAM5oC,QAAiBE,KAAKgpC,WAAWrmC,KAGrC,CAAExB,IAAK,iBAAkBC,YAG3B,OADAL,KACOjB,EAASyI,IAClB,CAAE,MAAOtG,GACP,MAAM,IAAI/B,EACR,mCAAmC4L,OAAO7J,KAE9C,GAzFAjC,KAAKgpC,WAAa,IAAI3mC,EAAiBf,EACzC,CAEA,gBAAM2nC,GACJ,IACE,MAAMnF,EAAU,CAAE7jC,KAAM,uBAAwB0a,QAAS,SACnDvZ,QAAgBwiC,GAAoB5jC,KAAKyoC,UAAW3E,GACpDhkC,QAAiBE,KAAKgpC,WAAWrmC,KAA+B,CACpExB,IAAK,kBACLC,YAMF,OAHApB,KAAK6kC,eAAgB,EACrB7kC,KAAKkpC,eAAiBppC,EAASyI,KAExBzI,CACT,CAAE,MAAOmC,GAEP,MADAjC,KAAK6kC,eAAgB,EACf,IAAI3kC,EAAkB,0BAA0B+B,IACxD,CACF,CAEA,UAAAknC,EAAWL,WAAEA,EAAUM,aAAEA,EAAYvF,WAAEA,IACrC,IAAK7jC,KAAK6kC,cACR,MAAM,IAAI3kC,EACR,wDAIJ,IAAKG,EAAYoC,SAASqmC,GACxB,MAAM,IAAI5oC,EACR,uBAAuB4oC,yBAAkCzoC,EAAYoF,KACnE,SD4LiB,IAACq/B,ICvLZsE,EDwLdb,GAAarD,mBAAmBJ,GCvL9B9kC,KAAK2oC,aAAe,CAClBG,aACAjF,aACAS,eAAgBtkC,KAAKkpC,gBAAgB5E,gBAAkB,GAE3D","x_google_ignoreList":[16,17,20]}