Skip to content

Latest commit

 

History

History
620 lines (602 loc) · 63.5 KB

APIs and Code Snippet.md

File metadata and controls

620 lines (602 loc) · 63.5 KB

Seed Fingerprinting API List

API Name
AudioParam.setValueAtTime
CanvasRenderingContext2D.arc
CanvasRenderingContext2D.fill
CanvasRenderingContext2D.fillText
DynamicsCompressorNode.connect
Geolocation.getCurrentPosition
Geolocation.watchPosition
Navigator.appCodeName
Navigator.appName
Navigator.cookieEnabled
Navigator.doNotTrack
Navigator.getBattery
Navigator.hardwareConcurrency
Navigator.javaEnabled
Navigator.language
Navigator.languages
Navigator.mimeTypes
Navigator.platform
Navigator.plugins
Navigator.productSub
Navigator.vendor
Navigator.vendorSub
OfflineAudioContext.createDynamicsCompressor
OfflineAudioContext.createOscillator
OscillatorNode.frequency
Screen.colorDepth
Screen.height
Screen.orientation
Screen.pixelDepth
Screen.width
WebGL2RenderingContext.canvas
WebGL2RenderingContext.getExtension
WebGL2RenderingContext.getParameter
WebGLRenderingContext.canvas
Window.devicePixelRatio

Sink API List

API Name
Client.postMessage
DedicatedWorkerGlobalScope.postMessage
Document.cookie
IDBObjectStore.add
IDBObjectStore.put
MessagePort.postMessage
Navigator.sendBeacon
RTCDataChannel.send
ServiceWorker.postMessage
WebSocket.send
Window.indexedDB
Window.localStorage
Window.openDatabase
Window.postMessage
Window.sessionStorage
Worker.postMessage
XMLHttpRequest.send

FP_APIs

API Name Documentation Proof Deployed(T/F)
AudioBuffer.getChannelData MDN 1 T
BatteryManager.charging MDN 1 T
BatteryManager.chargingTime MDN 1 T
BatteryManager.dischargingTime MDN 1 T
BatteryManager.level MDN 1, 2 T
CSSRuleList.length MDN 1, 2 F
CSSStyleDeclaration.cssText MDN 1, 2 F
CSSStyleDeclaration.getPropertyValue MDN 1, 2 F
CSSStyleDeclaration.setProperty MDN 1, 2 F
CSSStyleSheet.cssRules MDN 1, 2 F
CSSStyleSheet.insertRule MDN 1, 2 F
CanvasGradient.addColorStop MDN 1, 2 T
CanvasRenderingContext2D.beginPath MDN 1, 2 T
CanvasRenderingContext2D.bezierCurveTo MDN 1, 2 T
CanvasRenderingContext2D.canvas MDN 1, 2 T
CanvasRenderingContext2D.clearRect MDN 1, 2 T
CanvasRenderingContext2D.clip MDN 1, 2 T
CanvasRenderingContext2D.closePath MDN 1, 2 T
CanvasRenderingContext2D.createLinearGradient MDN 1, 2 T
CanvasRenderingContext2D.createRadialGradient MDN 1, 2 T
CanvasRenderingContext2D.ellipse MDN 1, 2 T
CanvasRenderingContext2D.fillRect MDN 1, 2 T
CanvasRenderingContext2D.getImageData MDN 1, 2 T
CanvasRenderingContext2D.isPointInPath MDN 1, 2 T
CanvasRenderingContext2D.lineTo MDN 1, 2 T
CanvasRenderingContext2D.measureText MDN 1, 2 T
CanvasRenderingContext2D.moveTo MDN 1, 2 T
CanvasRenderingContext2D.quadraticCurveTo MDN 1, 2 T
CanvasRenderingContext2D.rect MDN 1, 2 T
CanvasRenderingContext2D.restore MDN 1, 2 T
CanvasRenderingContext2D.rotate MDN 1, 2 T
CanvasRenderingContext2D.save MDN 1, 2 T
CanvasRenderingContext2D.stroke MDN 1, 2 T
CanvasRenderingContext2D.strokeText MDN 1, 2 T
CanvasRenderingContext2D.translate MDN 1, 2 T
Crypto.getRandomValues MDN 1 T
Crypto.subtle MDN 1 T
DOMRect.width MDN 1 F
DOMRect.y MDN 1 F
DeviceMotionEvent.rotationRate MDN 1, 2 T
DeviceMotionEventRotationRate.beta MDN 1, 2 T
DeviceMotionEventRotationRate.gamma MDN 1, 2 T
DeviceOrientationEvent.alpha MDN 1, 2 T
DeviceOrientationEvent.beta MDN 1, 2 T
DeviceOrientationEvent.gamma MDN 1, 2 T
DynamicsCompressorNode.attack MDN 1 T
DynamicsCompressorNode.knee MDN 1 T
DynamicsCompressorNode.ratio MDN 1 T
DynamicsCompressorNode.reduction MDN 1 T
DynamicsCompressorNode.release MDN 1 T
DynamicsCompressorNode.threshold MDN 1 T
GainNode.gain MDN 1 T
Geolocation.clearWatch MDN 1 T
HTMLCanvasElement.getContext MDN 1 T
HTMLCanvasElement.height MDN 1 T
HTMLCanvasElement.toDataURL MDN 1 T
HTMLCanvasElement.width MDN 1 T
History.length MDN N/A T
IdleDeadline.timeRemaining MDN 1 F
ImageData.data MDN 1, 2 T
IntersectionObserver.disconnect MDN 1, 2 F
IntersectionObserver.observe MDN 1, 2 F
IntersectionObserver.unobserve MDN 1, 2 F
IntersectionObserverEntry.intersectionRatio MDN 1, 2 F
IntersectionObserverEntry.isIntersecting MDN 1, 2 F
IntersectionObserverEntry.target MDN 1, 2 F
MediaDevices.enumerateDevices MDN 1 T
MediaDevices.getDisplayMedia MDN 1 T
MediaQueryList.addListener MDN 1 T
MediaQueryList.matches MDN 1 T
MediaSource.readyState MDN 1 F
MemoryInfo.jsHeapSizeLimit MDN 1 T
MemoryInfo.totalJSHeapSize MDN 1 T
MemoryInfo.usedJSHeapSize MDN 1 T
MimeTypeArray.item MDN 1 T
MimeTypeArray.length MDN 1 T
MimeTypeArray.namedItem MDN 1 T
MutationObserver.observe MDN 1 F
MutationRecord.addedNodes MDN 1 F
MutationRecord.attributeName MDN 1 F
MutationRecord.target MDN 1 F
Navigator.appVersion MDN 1, 2 T
Navigator.connection MDN 1, 2 T
Navigator.credentials MDN 1, 2 T
Navigator.geolocation MDN 1, 2 T
Navigator.getGamepads MDN 1, 2 T
Navigator.getUserMedia MDN 1, 2 T
Navigator.keyboard MDN 1, 2 T
Navigator.locks MDN 1, 2 T
Navigator.maxTouchPoints MDN 1, 2 T
Navigator.mediaCapabilities MDN 1, 2 T
Navigator.mediaDevices MDN 1, 2 T
Navigator.onLine MDN 1, 2 T
Navigator.permissions MDN 1, 2 T
Navigator.product MDN 1, 2 T
Navigator.serviceWorker MDN 1, 2 T
Navigator.unregisterProtocolHandler MDN 1, 2 T
Navigator.userAgent MDN 1, 2 T
Navigator.userAgentData MDN 1, 2 T
Navigator.vibrate MDN 1, 2 T
Navigator.webdriver MDN 1, 2 T
Navigator.webkitGetUserMedia MDN 1, 2 T
Navigator.webkitPersistentStorage MDN 1, 2 T
Navigator.webkitTemporaryStorage MDN 1, 2 T
Navigator.xr MDN 1, 2 T
NetworkInformation.downlink MDN 1 T
NetworkInformation.effectiveType MDN 1 T
NetworkInformation.rtt MDN 1 T
NetworkInformation.saveData MDN 1 T
NetworkInformation.type MDN 1 T
OfflineAudioCompletionEvent.renderedBuffer MDN 1 T
OfflineAudioContext.startRendering MDN 1 T
Performance.measure MDN 1 F
Performance.memory MDN 1 T
Performance.now MDN 1, 2, 3 F
Performance.timeOrigin MDN 1 T
Performance.timing MDN 1 T
PerformanceObserverEntryList.getEntries MDN 1 F
PerformanceResourceTiming.connectStart MDN 1 T
PerformanceResourceTiming.fetchStart MDN N/A T
PerformanceResourceTiming.responseEnd MDN N/A T
PerformanceResourceTiming.responseStart MDN N/A T
PerformanceResourceTiming.toJSON MDN N/A T
PerformanceTiming.connectEnd MDN 1 T
PerformanceTiming.domainLookupEnd MDN 1 T
PerformanceTiming.fetchStart MDN N/A T
PerformanceTiming.loadEventStart MDN N/A T
PerformanceTiming.navigationStart MDN N/A T
PerformanceTiming.responseStart MDN N/A T
PermissionStatus.state MDN 1 F
PluginArray.item MDN 1 T
PluginArray.length MDN 1 T
PluginArray.namedItem MDN 1 T
PluginArray.refresh MDN 1 T
PresentationRequest.getAvailability MDN 1, 2 F
ProgressEvent.loaded MDN 1 F
ProgressEvent.total MDN 1 F
RTCSessionDescription.sdp MDN 1 F
Screen.availHeight MDN 1 T
Screen.availLeft MDN 1 T
Screen.availTop MDN 1 T
Screen.availWidth MDN 1 T
Screen.left MDN 1 T
ScreenOrientation.angle MDN 1, 2 T
ScreenOrientation.lock MDN 1 T
ScreenOrientation.type MDN 1, 2 T
ScreenOrientation.unlock MDN 1 T
ServiceWorkerContainer.controller MDN 1 F
SourceBuffer.appendBuffer MDN 1, 2 F
SourceBuffer.buffered MDN 1, 2 F
SourceBuffer.updating MDN 1, 2 F
TextMetrics.fontBoundingBoxAscent MDN 1, 2 T
TextMetrics.width MDN 1, 2 T
TimeRanges.end MDN 1 F
TimeRanges.length MDN 1 F
TimeRanges.start MDN 1 F
WebGL2RenderingContext.attachShader MDN 1, 2 T
WebGL2RenderingContext.bindBuffer MDN 1, 2 T
WebGL2RenderingContext.bindTexture MDN 1, 2 T
WebGL2RenderingContext.bufferData MDN 1, 2 T
WebGL2RenderingContext.compileShader MDN 1, 2 T
WebGL2RenderingContext.createBuffer MDN 1, 2 T
WebGL2RenderingContext.createProgram MDN 1, 2 T
WebGL2RenderingContext.createShader MDN 1, 2 T
WebGL2RenderingContext.createTexture MDN 1, 2 T
WebGL2RenderingContext.deleteProgram MDN 1, 2 T
WebGL2RenderingContext.drawArrays MDN 1, 2 T
WebGL2RenderingContext.getContextAttributes MDN 1, 2 T
WebGL2RenderingContext.getShaderPrecisionFormat MDN 1, 2 T
WebGL2RenderingContext.getSupportedExtensions MDN 1, 2 T
WebGL2RenderingContext.isContextLost MDN 1, 2 T
WebGL2RenderingContext.isEnabled MDN 1 , 2 T
WebGL2RenderingContext.shaderSource MDN 1, 2 T
WebGL2RenderingContext.texImage2D MDN 1, 2 T
WebGL2RenderingContext.texParameteri MDN 1, 2 T
WebGLLoseContext.loseContext W3 1, 2 T
WebGLRenderingContext.createBuffer MDN 1, 2 T
WebGLRenderingContext.drawArrays MDN 1, 2 T
WebGLRenderingContext.getExtension MDN 1, 2 T
WebGLRenderingContext.getParameter MDN 1, 2 T
WebGLRenderingContext.getShaderPrecisionFormat MDN 1, 2 T
WebGLShaderPrecisionFormat.precision MDN 1, 2 T
WebGLShaderPrecisionFormat.rangeMax MDN 1, 2 T
Window.applicationCache MDN 1 T
Window.clearTimeout MDN 1 T
Window.clientInformation MDN 1 T
Window.closed MDN 1 T
Window.crypto MDN 1 T
Window.defaultstatus MDN 1 T
Window.document MDN 1 T
Window.event MDN 1 T
Window.external MDN 1 T
Window.fetch MDN 1 T
Window.frames MDN 1 T
Window.getComputedStyle MDN 1 T
Window.history MDN 1 T
Window.innerHeight MDN 1, 2 T
Window.innerWidth MDN 1, 2 T
Window.length MDN 1 T
Window.location MDN 1 T
Window.locationbar MDN 1 T
Window.matchMedia MDN 1 T
Window.name MDN 1 T
Window.navigator MDN 1 T
Window.onerror MDN 1 T
Window.ontouchstart MDN 1 T
Window.open MDN 1 T
Window.opener MDN 1 T
Window.orientation MDN 1 T
Window.outerHeight MDN 1, 2 T
Window.outerWidth MDN 1, 2 T
Window.pageXOffset MDN 1 T
Window.pageYOffset MDN 1 T
Window.parent MDN 1 T
Window.performance MDN 1 T
Window.requestAnimationFrame MDN 1 T
Window.requestIdleCallback MDN 1 T
Window.screen MDN 1 T
Window.screenLeft MDN 1 T
Window.screenTop MDN 1 T
Window.screenX MDN 1 T
Window.screenY MDN 1 T
Window.self MDN 1 T
Window.setInterval MDN 1 T
Window.setTimeout MDN 1 T
Window.speechSynthesis MDN 1 T
Window.top MDN 1 T
Window.visualViewport MDN 1 T
Window.webkitRequestFileSystem MDN 1 T
Window.window MDN 1 T

(De)Obfuscation APIs

API Name Documentation Crawled Script
TextDecoder.decode MDN Obfuscation
TextEncoder.encode MDN Obfuscation
Window.atob MDN Obfuscation
Window.btoa MDN Obfuscation

New Fingerprinting APIs Found in Second Crawling

API Name Documentation Proof Deployed(T/F)
BarProp.visible MDN N/A F
CanvasRenderingContext2D.font MDN 1 T
CanvasRenderingContext2D.scale MDN 1 T
CanvasRenderingContext2D.setLineDash MDN 1 T
DOMRect.height MDN 1 T
MutationRecord.type MDN 1 F
Navigator.bluetooth MDN 1 T
NetworkInformation.onchange MDN 1 T
OffscreenCanvas.getContext MDN 1 T
PageTransitionEvent.persisted MDN N/A F
Performance.mark MDN 1 F
PerformanceResourceTiming.initiatorType MDN 1 F
Permissions.query MDN N/A F
SpeechSynthesis.getVoices MDN 1 F
VisualViewport.width MDN N/A F
WebGLRenderingContext.getContextAttribute MDN 1 T
WebGLShaderPrecisionFormat.rangeMin MDN 1 T
Window.statusbar MDN N/A F

Sinks + URl-related APIs

API Name
DeprecatedStorageQuota.requestQuota
HTMLAnchorElement.hash
HTMLAnchorElement.host
HTMLAnchorElement.hostname
HTMLAnchorElement.href
HTMLAnchorElement.origin
HTMLAnchorElement.password
HTMLAnchorElement.pathname
HTMLAnchorElement.port
HTMLAnchorElement.protocol
HTMLAnchorElement.search
HTMLAnchorElement.text
HTMLIFrameElement.contentDocument
HTMLIFrameElement.contentWindow
HTMLIFrameElement.name
HTMLIFrameElement.src
HTMLScriptElement.src
IDBDatabase.createObjectStore
IDBFactory.open
Location.ancestorOrigins
Location.hash
Location.host
Location.hostname
Location.href
Location.origin
Location.pathname
Location.port
Location.protocol
Location.reload
Location.search
Location.toString
Location.valueOf
MessageEvent.data
MessageEvent.origin
RTCPeerConnection.createDataChannel
RTCPeerConnection.createOffer
RTCPeerConnection.localDescription
RTCPeerConnection.setLocalDescription
Response.json
Storage.clear
Storage.getItem
Storage.length
Storage.removeItem
Storage.setItem
URL.host
URL.href
URL.pathname
URL.searchParams
URLSearchParams.get
Window.clearInterval
XMLHttpRequest.abort
XMLHttpRequest.getResponseHeader
XMLHttpRequest.open
XMLHttpRequest.readyState
XMLHttpRequest.response
XMLHttpRequest.responseText
XMLHttpRequest.responseURL
XMLHttpRequest.setRequestHeader
XMLHttpRequest.status
XMLHttpRequest.statusText
XMLHttpRequest.timeout
XMLHttpRequest.withCredentials

False Positives

API Name
AbortController.abort
AbortController.signal
Attr.name
Attr.value
CustomEvent.detail
DOMException.message
DOMStringList.length
DOMTokenList.add
DOMTokenList.contains
DOMTokenList.remove
Document.evaluate
Element.matches
Event.stopImmediatePropagation
Event.target
FormData.append
HTMLCollection.length
HTMLImageElement.decode
HTMLInputElement.defaultValue
HTMLInputElement.files
HTMLInputElement.value
HTMLMetaElement.content
HTMLMetaElement.name
Node.appendChild
NodeList.item
NodeList.length
UnderlyingSourceBase.type

Fingerprinting Code Snippets

PermissionStatus.state and Permissions.query

        t.prototype.getPermissionsMetadata = function () {
            return __awaiter(this, void 0, void 0, function () {
                var t, n, i, r, o, a;
                return __generator(this, function (s) {
                    switch (s.label) {
                        case 0:
                            if (t = {}, n = ["accelerometer", "accessibility-events", "ambient-light-sensor", "background-sync", "camera", "clipboard-read", "clipboard-write", "geolocation", "gyroscope", "magnetometer", "microphone", "midi", "notifications", "payment-handler", "persistent-storage", "push"], i = [], navigator.permissions)
                                for (o in r = function (e) {
                                        var r = n[e];
                                        i.push(navigator.permissions.query({
                                            name: r
                                        }).then(function (e) {
                                            t[r] = e.state
                                        }).catch(function (e) {}))
                                    }, n) r(o);
                            s.label = 1;
                        case 1:
                            return s.trys.push([1, 3, , 4]), [4, Promise.all(i)];
                        case 2:
                            return s.sent(), [3, 4];
                        case 3:
                            return a = s.sent(), e.STLogger.warn(a), [3, 4];
                        case 4:
                            return [2, t]
                    }
                })
            })
        }

PageTransitionEvent.persisted

            function () {
                var t = !1;
                if ("localStorage" in window) try {
                    window.localStorage.setItem("\_tmptest", "tmpval"), t = !0, window.localStorage.removeItem("\_tmptest")
                } catch (t) {}
                if (t) try {
                    window.localStorage && (_ = window.localStorage, b = "localStorage", j = \_.jStorage_update)
                } catch (t) {} else if ("globalStorage" in window) try {
                    window.globalStorage && (_ = "localhost" == window.location.hostname ? window.globalStorage["localhost.localdomain"] : window.globalStorage[window.location.hostname], b = "globalStorage", j = \_.jStorage_update)
                } catch (t) {} else {
                    if (w = document.createElement("link"), !w.addBehavior) return void(w = null);
                    w.style.behavior = "url(#default#userData)", document.getElementsByTagName("head")[0].appendChild(w);
                    try {
                        w.load("jStorage")
                    } catch (t) {
                        w.setAttribute("jStorage", "{}"), w.save("jStorage"), w.load("jStorage")
                    }
                    var n = "{}";
                    try {
                        n = w.getAttribute("jStorage")
                    } catch (t) {}
                    try {
                        j = w.getAttribute("jStorage_update")
                    } catch (t) {}
                    \_.jStorage = n, b = "userDataBehavior"
                }
                s(), h(), e(), u(), "addEventListener" in window && window.addEventListener("pageshow", function (t) {
                    t.persisted && i()
                }, !1)
            }()

ServiceWorkerContainer.controller

            t.prototype.ht = function () {
            var t = this;
            this.u.X = this.tt("longtask", (function (e) {
                t.ft({
                    W: e
                })
            }))
        }, t.prototype.v = function () {
            return s && !!s.getEntriesByType && !!s.now && !!s.mark
        }, t.prototype.l = function () {
            return "PerformanceObserver" in o
        }, t.prototype.ct = function (t) {
            var e = s.getEntriesByName(t),
                i = e[e.length - 1];
            return i && "measure" === i.entryType ? i.duration : -1
        }, t.prototype.L = function () {
            return a ? {
                deviceMemory: a.deviceMemory ? a.deviceMemory : 0,
                hardwareConcurrency: a.hardwareConcurrency ? a.hardwareConcurrency : 0,
                serviceWorkerStatus: "serviceWorker" in a ? a.serviceWorker.controller ? "controlled" : "supported" : "unsupported"
            } : {}
        }, t.prototype._ = function () {
            if (!this.v()) return {};
            var t = performance.getEntriesByType("navigation")[0];
            if (!t) return {};
            var e = t.responseStart,
                i = t.responseEnd;
            return {
                fetchTime: i - t.fetchStart,
                workerTime: t.workerStart > 0 ? i - t.workerStart : 0,
                totalTime: i - t.requestStart,
                downloadTime: i - e,
                timeToFirstByte: e - t.requestStart,
                headerSize: t.transferSize - t.encodedBodySize || 0,
                dnsLookupTime: t.domainLookupEnd - t.domainLookupStart
            }
        }, t.prototype.I = function () {
            if ("connection" in a) {
                var t = a.connection;
                return "object" != typeof t ? {} : (f = t.effectiveType, d = !!t.saveData, {
                    downlink: t.downlink,
                    effectiveType: t.effectiveType,
                    rtt: t.rtt,
                    saveData: !!t.saveData
                })
            }
            return {}
        }

History.length

        var ke = X("guid", "ON"),
            le = !d.google_conversion_domain && "GooglemKTybQhCsO" in v &&
            "function" == typeof v.GooglemKTybQhCsO ? X("resp", "GooglemKTybQhCsO") : "",
            me = X("disvt", d.google_disable_viewthrough),
            ne = X("eid", Nb().join());
        var ha = d.google_conversion_date;
        var x = [];
        if (a) {
            var H = a.screen;
            H && (x.push(X("u_h", H.height)), x.push(X("u_w", H.width)), x.push(X("u_ah", H.availHeight)), x.push(X("u_aw", H.availWidth)), x.push(X("u_cd", H.colorDepth)));
            a.history && x.push(X("u_his", a.history.length))
        }
        ha && "function" == typeof ha.getTimezoneOffset && x.push(X("u_tz", -ha.getTimezoneOffset()));
        b && ("function" == typeof b.javaEnabled &&
            x.push(X("u_java", b.javaEnabled())), b.plugins && x.push(X("u_nplug", b.plugins.length)), b.mimeTypes && x.push(X("u_nmime", b.mimeTypes.length)));
        ha = x.join("");
        x = X("gtm", d.google_gtm);
        b = b && b.sendBeacon ? X("sendb", "1") : "";

Window.statusbar and BarProp.visible

        function g() {
            var e = [];
            return document.querySelectorAll("script[src*=extension]").forEach(function(t) {
                var r = t.getAttribute("src");
                r && e.push(r)
            }), JSON.stringify(e)
        }

        function m() {
            for (var e = ["innerHeight", "innerWidth", "outerWidth", "outerHeight", "devicePixelRatio"], t = {}, r = 0; r < e.length; r++) {
                var n = e[r];
                t[n] = window[n]
            }
            return window.statusbar && (t.statusbar_visible = window.statusbar.visible), t.length = window.length, t.modified = Object.getOwnPropertyNames(window.screen), JSON.stringify(t)
        }

        function w(e) {
            var r = {};
            for (var n in e)
                if ("enabledPlugin" !== n && "function" != typeof e[n])
                    if ("object" === (0, t.default)(e[n])) {
                        var o = w(e[n]);
                        Object.keys(o) && (r[n] = o)
                    } else r[n] = e[n];
            return r
        }

MediaQueryList.matches

      isHighDensity: (a = window.matchMedia && (window.matchMedia("only screen and (min-resolution: 124dpi), only screen and (min-resolution: 1.3dppx), only screen and (min-resolution: 48.8dpcm)").matches || window.matchMedia("only screen and (-webkit-min-device-pixel-ratio: 1.3), only screen and (-o-min-device-pixel-ratio: 2.6/2), only screen and (min--moz-device-pixel-ratio: 1.3), only screen and (min-device-pixel-ratio: 1.3)").matches) || window.devicePixelRatio && window.devicePixelRatio > 1.3, function () {
        return a
      }),
      isSmartPhone: (s = window.matchMedia && window.matchMedia(" only screen and (min-device-width : 320px) and (max-device-width : 480px)").matches || /(iPhone|iPod)/g.test(navigator.userAgent), function () {
        return s
      }),
      isTablet: (n = window.matchMedia && window.matchMedia(" only screen and (min-device-width : 768px) and (max-device-width : 1024px)").matches || /(iPhone|iPod)/g.test(navigator.userAgent), function () {
        return n
      }),
      isDesktop: function () {
        return !(this.isTablet() || this.isSmartPhone())
      },
      getOuterWidth: function (e) {
        var t, r, i;
        return e.getBoundingClientRect().width + parseFloat(getComputedStyle(e).marginLeft) + parseFloat(getComputedStyle(e).marginRight)
      },
      isHtmlContent: function (e) {
        return /(?:%3C|[<>&])/.test(e)
      },
      setContentToElement: function (e, t) {
        TRC.dom.isHtmlContent(t) ? e.innerHTML = t : e.innerText = t
      }