Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

General purpose observer injection #14

Merged
merged 16 commits into from
May 27, 2022
Merged

General purpose observer injection #14

merged 16 commits into from
May 27, 2022

Conversation

rviscomi
Copy link
Member

@rviscomi rviscomi commented May 22, 2022

Progress on:

HTTPArchive/almanac.httparchive.org#2881
HTTPArchive/almanac.httparchive.org#2890
HTTPArchive/almanac.httparchive.org#2891

Changes the observer behavior to be able to handle wildcards in the property pathname. For example, navigator.* will observe all properties on the navigator object. Special handling was added for __proto__ properties. Also adds the ability to capture the call stack for any particular properties.

Tests

example.com

Results

It seems like the reset isn't being applied early enough. This might fix itself after the change is merged and the WPT agents consistently execute them in alphabetical order.

As expected, navigator.userAgent is not detected and the call stack is empty.

{
    "call_stacks": {
        "navigator.userAgent": []
    },
    "navigator.clipboard": 2,
    "navigator.storage": 2,
    "navigator.serviceWorker": 4,
    "performance.clearMarks": 1,
    "performance.clearMeasures": 1,
    "performance.getEntriesByType": 9,
    "performance.timing": 9,
    "performance.timing.domInteractive": 1,
    "performance.timing.domContentLoadedEventStart": 1,
    "performance.timing.domContentLoadedEventEnd": 1,
    "performance.timing.domComplete": 1,
    "performance.timing.loadEventStart": 1,
    "performance.timing.loadEventEnd": 1,
    "Array.prototype.constructor": 57,
    "Array.prototype.push": 9,
    "Array.prototype.slice": 1,
    "Array.prototype.sort": 2,
    "Array.prototype.includes": 16,
    "Array.prototype.indexOf": 182,
    "Array.prototype.join": 1,
    "Array.prototype.forEach": 8,
    "Array.prototype.filter": 35,
    "Array.prototype.map": 21,
    "Array.prototype.some": 2,
    "Array.prototype.reduce": 6,
    "String.prototype.includes": 13,
    "String.prototype.indexOf": 83,
    "String.prototype.match": 50,
    "String.prototype.replace": 13,
    "String.prototype.slice": 1,
    "String.prototype.split": 12,
    "String.prototype.substring": 20,
    "String.prototype.trim": 11,
    "String.prototype.toLowerCase": 35
}

https://codepen.io/rviscomi/pen/rNJMmgy

const _hjs2 = navigator;
const __483 = 'userAgent'

function functionA() {
  console.log(_hjs2[__483])
}

function functionB() {
  console.log(_hjs2['userAgent'])
  console.log(navigator.userAgent)
}

functionA();
functionB();

Results

Omitted the custom metric observations from these results for clarity, but they're the same as above.

{
    "call_stacks": {
        "navigator.userAgent": {
            "Error\n at Navigator.get (<anonymous>:95:19)\n at functionA (https://cdpn.io/pen/debug/rNJMmgy?authentication_hash=yoAZEBpBQdVr:41:20)\n at https://cdpn.io/pen/debug/rNJMmgy?authentication_hash=yoAZEBpBQdVr:49:1": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at functionB (https://cdpn.io/pen/debug/rNJMmgy?authentication_hash=yoAZEBpBQdVr:45:20)\n at https://cdpn.io/pen/debug/rNJMmgy?authentication_hash=yoAZEBpBQdVr:50:1": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at functionB (https://cdpn.io/pen/debug/rNJMmgy?authentication_hash=yoAZEBpBQdVr:46:25)\n at https://cdpn.io/pen/debug/rNJMmgy?authentication_hash=yoAZEBpBQdVr:50:1": 1
        }
    },
    "navigator.userAgent": 3
}

nytimes.com

Results

Show custom metric results
{
    "call_stacks": {
        "navigator.userAgent": {
            "Error\n at Navigator.get (<anonymous>:95:19)\n at _f (https://www.nytimes.com/:53:1187)\n at https://www.nytimes.com/:53:1287\n at https://www.nytimes.com/:53:1306": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at https://www.nytimes.com/:55:62\n at https://www.nytimes.com/:85:40": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at https://www.nytimes.com/:56:13\n at https://www.nytimes.com/:85:40": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at getUserAgent (https://www.nytimes.com/:117:318)\n at addNYTAppClass (https://www.nytimes.com/:117:814)\n at _f (https://www.nytimes.com/:117:1770)\n at https://www.nytimes.com/:117:2505\n at https://www.nytimes.com/:117:4207": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at s (https://www.nytimes.com/:128:3434)\n at Object.te [as loadScripts] (https://www.nytimes.com/:128:12516)\n at _f (https://www.nytimes.com/:129:434)\n at https://www.nytimes.com/:129:678\n at https://www.nytimes.com/:129:909\n at https://www.nytimes.com/:131:13": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at https://www.nytimes.com/:128:1148\n at a (https://www.nytimes.com/:128:1326)\n at e (https://www.nytimes.com/:128:3315)\n at s (https://www.nytimes.com/:128:3480)\n at Object.te [as loadScripts] (https://www.nytimes.com/:128:12516)\n at _f (https://www.nytimes.com/:129:434)\n at https://www.nytimes.com/:129:678\n at https://www.nytimes.com/:129:909\n at https://www.nytimes.com/:131:13": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at La (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11328)\n at Pc (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:2267)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:2229\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:596\n at Mc (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:1520)\n at ug (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:25529)\n at pg (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:25313)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:24349\n at Array.forEach (<anonymous>)": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at La (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11328)\n at Pc (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:2267)\n at Array.some (<anonymous>)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:2084\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:596\n at Mc (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:1527)\n at ug (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:25529)\n at pg (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:25313)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:24349": 4,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at https://rumcdn.geoedge.be/b3960cc6-bfd2-4adc-910c-6e917e8a6a0e/grumi-ip.js:1:4198\n at https://rumcdn.geoedge.be/b3960cc6-bfd2-4adc-910c-6e917e8a6a0e/grumi-ip.js:1:12314": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at https://rumcdn.geoedge.be/b3960cc6-bfd2-4adc-910c-6e917e8a6a0e/grumi-ip.js:1:4219\n at https://rumcdn.geoedge.be/b3960cc6-bfd2-4adc-910c-6e917e8a6a0e/grumi-ip.js:1:12314": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at e.exports (https://www.nytimes.com/ads/prebid6.8.0.js:9:14934)\n at 115 (https://www.nytimes.com/ads/prebid6.8.0.js:3:33854)\n at i (https://www.nytimes.com/ads/prebid6.8.0.js:3:406)\n at 114 (https://www.nytimes.com/ads/prebid6.8.0.js:3:33629)\n at i (https://www.nytimes.com/ads/prebid6.8.0.js:3:406)\n at 87 (https://www.nytimes.com/ads/prebid6.8.0.js:9:110110)\n at i (https://www.nytimes.com/ads/prebid6.8.0.js:3:406)\n at 23 (https://www.nytimes.com/ads/prebid6.8.0.js:9:8924)\n at i (https://www.nytimes.com/ads/prebid6.8.0.js:3:406)": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at t.isSafariBrowser (https://www.nytimes.com/ads/prebid6.8.0.js:3:5536)\n at 60 (https://www.nytimes.com/ads/prebid6.8.0.js:9:69895)\n at i (https://www.nytimes.com/ads/prebid6.8.0.js:3:406)\n at 28 (https://www.nytimes.com/ads/prebid6.8.0.js:9:21210)\n at i (https://www.nytimes.com/ads/prebid6.8.0.js:3:406)\n at 22 (https://www.nytimes.com/ads/prebid6.8.0.js:9:6572)\n at i (https://www.nytimes.com/ads/prebid6.8.0.js:3:406)\n at 231 (https://www.nytimes.com/ads/prebid6.8.0.js:9:9246)\n at i (https://www.nytimes.com/ads/prebid6.8.0.js:3:406)": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at https://news.google.com/swg/js/v1/swg.js:319:425\n at https://news.google.com/swg/js/v1/swg.js:319:673\n at https://news.google.com/swg/js/v1/swg.js:319:683": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at xa (https://news.google.com/swg/js/v1/swg.js:11:473)\n at new Lf (https://news.google.com/swg/js/v1/swg.js:305:246)\n at https://news.google.com/swg/js/v1/swg.js:295:699": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at xa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2686)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:1703\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at xa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2686)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:1720\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at xa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2686)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:1735\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at xa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2686)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:1749\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at xa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2686)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:1763\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:1781\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at xa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2686)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:1812\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:1873\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at xa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2686)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:1904\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:2013\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:2235\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at xa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2686)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:2517\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at xa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2686)\n at Aa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:3050)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:2537\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at xa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2686)\n at Aa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:3079)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:2537\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at xa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2686)\n at Ba (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2912)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:2542\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at xa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2686)\n at Aa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:3050)\n at Ba (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2928)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:2542\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at xa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2686)\n at Aa (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:3079)\n at Ba (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2928)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:2542\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at La (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11328)\n at Ma (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11369)\n at Ec (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:906)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:2428\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:596\n at <computed>.a.<computed> (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:22482)\n at Ze (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16520)\n at $e (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16175)\n at Array.<anonymous> (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16269)": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at La (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11328)\n at Ma (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11369)\n at Ec (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:918)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:2428\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:596\n at <computed>.a.<computed> (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:22482)\n at Ze (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16520)\n at $e (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16175)\n at Array.<anonymous> (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16269)": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at La (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11328)\n at Ma (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11369)\n at Ec (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:948)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:2428\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:596\n at <computed>.a.<computed> (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:22482)\n at Ze (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16520)\n at $e (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16175)\n at Array.<anonymous> (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16269)": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at La (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11328)\n at Ma (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11369)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:2435\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:596\n at <computed>.a.<computed> (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:22482)\n at Ze (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16520)\n at $e (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16175)\n at Array.<anonymous> (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16269)\n at Ye (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16069)": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at La (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11328)\n at Ma (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11369)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:2447\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:596\n at <computed>.a.<computed> (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:22482)\n at Ze (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16520)\n at $e (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16175)\n at Array.<anonymous> (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16269)\n at Ye (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16069)": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at La (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11328)\n at Ma (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11369)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:2461\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:596\n at <computed>.a.<computed> (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:22482)\n at Ze (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16520)\n at $e (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16175)\n at Array.<anonymous> (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16269)\n at Ye (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16069)": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at La (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11328)\n at Ma (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11369)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:2476\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:596\n at <computed>.a.<computed> (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:22482)\n at Ze (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16520)\n at $e (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16175)\n at Array.<anonymous> (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16269)\n at Ye (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16069)": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at La (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11328)\n at Ma (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11369)\n at Ec (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:906)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:2494\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:596\n at <computed>.a.<computed> (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:22482)\n at Ze (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16520)\n at $e (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16175)\n at Array.<anonymous> (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16269)": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at La (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11328)\n at Ma (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11369)\n at Ec (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:918)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:2494\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:596\n at <computed>.a.<computed> (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:22482)\n at Ze (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16520)\n at $e (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16175)\n at Array.<anonymous> (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16269)": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at La (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11328)\n at Ma (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11369)\n at Ec (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:948)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:2494\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:596\n at <computed>.a.<computed> (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:22482)\n at Ze (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16520)\n at $e (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16175)\n at Array.<anonymous> (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16269)": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at $f (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:21567)\n at <computed>.a.<computed> (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:22775)\n at Ze (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16520)\n at $e (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16175)\n at Array.<anonymous> (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16269)\n at Ye (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16069)\n at $e (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16304)\n at af (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:17073)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:25217": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at $f (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:21567)\n at <computed>.a.<computed> (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:22775)\n at Ze (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16520)\n at $e (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16175)\n at af (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:17073)\n at pg (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:24743)\n at https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:24349\n at Array.forEach (<anonymous>)\n at Na (https://securepubads.g.doubleclick.net/tag/js/gpt.js:6:11431)": 7,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at $f (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:21567)\n at <computed>.a.<computed> (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:22775)\n at Ze (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16520)\n at $e (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16175)\n at Array.<anonymous> (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16269)\n at Ye (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16069)\n at $e (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:16304)\n at af (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:17073)\n at pg (https://securepubads.g.doubleclick.net/tag/js/gpt.js:10:24743)": 3,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at At (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:27526)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:27488\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:546\n at Xo (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:80623)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:57305\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59152\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59311": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at va (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:2644)\n at At (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:27526)\n at Array.some (<anonymous>)\n at _.We (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:99644)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:27257\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:10:546\n at Xo (https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:6:80629)\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:57305\n at https://securepubads.g.doubleclick.net/gpt/pubads_impl_2022051901.js:18:59152": 4,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:234:471\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:506:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:234:483\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:506:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:234:498\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:506:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:234:509\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:506:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:234:521\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:506:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1193)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:234:538\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:506:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:234:577\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:506:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1193)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:234:631\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:506:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:234:670\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:506:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:234:682\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:506:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:234:695\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:506:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:234:711\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:506:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:234:725\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:506:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:234:814\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:506:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1251)\n at Vn (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:234:431)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:234:828\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:506:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:234:833\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:506:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:234:844\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:506:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1251)\n at Vn (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:234:431)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:234:855\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:506:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:234:861\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:506:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1193)\n at ub (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1251)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:234:873\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:506:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at tb (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:46:1193)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:234:884\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:506:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at eval (eval at w.<computed>.e (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:3:56), <anonymous>:1:69)\n at eval (eval at w.<computed>.e (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:3:56), <anonymous>:1:85)\n at w.<computed>.e (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:3:56)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:413:249\n at qe (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:93:769)\n at re (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:94:337)\n at se (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:93:861)\n at ue (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:96:183)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:97:161": 5,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at eval (eval at w.<computed>.e (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:3:56), <anonymous>:1:30)\n at eval (eval at w.<computed>.e (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:3:56), <anonymous>:1:129)\n at w.<computed>.e (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:3:56)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:413:249\n at qe (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:93:769)\n at re (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:94:337)\n at se (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:93:861)\n at ue (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:96:183)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:97:161": 5,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at <anonymous>:1:434\n at <anonymous>:7:42\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:477:414\n at b (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:478:337)\n at qe (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:93:769)\n at e (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:216:34)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:42:130\n at Array.<anonymous> (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:217:454)\n at Object.execute (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:217:194)": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at <anonymous>:1:479\n at <anonymous>:7:42\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:477:414\n at b (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:478:337)\n at qe (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:93:769)\n at e (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:216:34)\n at https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:42:130\n at Array.<anonymous> (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:217:454)\n at Object.execute (https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x:217:194)": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/pages/embeds/_type_-dashboard/index.html.svelte-62479322.js:3:42958\n at st (https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/chunks/index-b1b2b324.js:1:104)\n at Array.map (<anonymous>)\n at https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/chunks/index-b1b2b324.js:4:3950\n at yt (https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/chunks/index-b1b2b324.js:4:1517)\n at We (https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/chunks/index-b1b2b324.js:4:5006)\n at new Lt (https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/start-f9b2ea41.js:1:6454)\n at De (https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/start-f9b2ea41.js:1:34189)\n at Object._hydrate (https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/start-f9b2ea41.js:1:42833)": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/pages/embeds/_type_-dashboard/index.html.svelte-62479322.js:3:43020\n at st (https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/chunks/index-b1b2b324.js:1:104)\n at Array.map (<anonymous>)\n at https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/chunks/index-b1b2b324.js:4:3950\n at yt (https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/chunks/index-b1b2b324.js:4:1517)\n at We (https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/chunks/index-b1b2b324.js:4:5006)\n at new Lt (https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/start-f9b2ea41.js:1:6454)\n at De (https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/start-f9b2ea41.js:1:34189)\n at Object._hydrate (https://static01.nyt.com/newsgraphics/2021/coronavirus-tracking/_app/start-f9b2ea41.js:1:42833)": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at https://static01.nyt.com/newsgraphics/2020/08/25/live-events-calendar/e6574a3b315277a0bd1b032c30da9f3ba1e366ad/build/js/main.js:1:92": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at new _0x2a936d (https://dd.nytimes.com/tags.js:2:117851)\n at <computed> [as processSyncRequest] (https://dd.nytimes.com/tags.js:2:236074)\n at https://dd.nytimes.com/tags.js:2:208787\n at 6 (https://dd.nytimes.com/tags.js:2:210278)\n at _0x2f3da3 (https://dd.nytimes.com/tags.js:2:37071)\n at n (https://dd.nytimes.com/tags.js:2:37497)\n at https://dd.nytimes.com/tags.js:2:37547": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at <computed> [as process] (https://dd.nytimes.com/tags.js:2:129347)\n at <computed> [as processSyncRequest] (https://dd.nytimes.com/tags.js:2:236125)\n at https://dd.nytimes.com/tags.js:2:208787\n at 6 (https://dd.nytimes.com/tags.js:2:210278)\n at _0x2f3da3 (https://dd.nytimes.com/tags.js:2:37071)\n at n (https://dd.nytimes.com/tags.js:2:37497)\n at https://dd.nytimes.com/tags.js:2:37547": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at <computed> [as process] (https://dd.nytimes.com/tags.js:2:129477)\n at <computed> [as processSyncRequest] (https://dd.nytimes.com/tags.js:2:236125)\n at https://dd.nytimes.com/tags.js:2:208787\n at 6 (https://dd.nytimes.com/tags.js:2:210278)\n at _0x2f3da3 (https://dd.nytimes.com/tags.js:2:37071)\n at n (https://dd.nytimes.com/tags.js:2:37497)\n at https://dd.nytimes.com/tags.js:2:37547": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at <computed> [as process] (https://dd.nytimes.com/tags.js:2:129615)\n at <computed> [as processSyncRequest] (https://dd.nytimes.com/tags.js:2:236125)\n at https://dd.nytimes.com/tags.js:2:208787\n at 6 (https://dd.nytimes.com/tags.js:2:210278)\n at _0x2f3da3 (https://dd.nytimes.com/tags.js:2:37071)\n at n (https://dd.nytimes.com/tags.js:2:37497)\n at https://dd.nytimes.com/tags.js:2:37547": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:471\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:483\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:498\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:509\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:521\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:538\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:577\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:631\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:670\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:682\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:695\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:711\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:725\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:814\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at Ik (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:431)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:828\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:833\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:844\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at Ik (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:431)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:855\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:861\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at Ta (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:620)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:873\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at Sa (https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:32:562)\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:153:884\n at https://www.googletagmanager.com/gtm.js?id=GTM-N5P6T9S&l=dataLayer:246:3": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at <computed> [as dd_i] (https://dd.nytimes.com/tags.js:2:137258)\n at https://dd.nytimes.com/tags.js:2:131156": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at _0x2a936d.dd_s (https://dd.nytimes.com/tags.js:2:144195)\n at https://dd.nytimes.com/tags.js:2:131156": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at _0x2a936d.dd_t (https://dd.nytimes.com/tags.js:2:145725)\n at https://dd.nytimes.com/tags.js:2:131156": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at _0x2a936d.dd_M (https://dd.nytimes.com/tags.js:2:166737)\n at https://dd.nytimes.com/tags.js:2:131156": 1,
            "Error\n at Navigator.get (<anonymous>:95:19)\n at _0x3efb98.exports.isSafariUA (https://dd.nytimes.com/tags.js:2:45582)\n at <computed> [as requestApi] (https://dd.nytimes.com/tags.js:2:189430)\n at https://dd.nytimes.com/tags.js:2:236294": 1
        }
    },
    "navigator.productSub": 1,
    "navigator.vendor": 1,
    "navigator.maxTouchPoints": 2,
    "navigator.plugins": 21,
    "navigator.mimeTypes": 9,
    "navigator.hardwareConcurrency": 1,
    "navigator.cookieEnabled": 1,
    "navigator.appName": 3,
    "navigator.appVersion": 3,
    "navigator.platform": 1,
    "navigator.userAgent": 125,
    "navigator.language": 2,
    "navigator.languages": 1,
    "navigator.webdriver": 7,
    "navigator.sendBeacon": 6,
    "navigator.clipboard": 2,
    "navigator.mediaDevices": 1,
    "navigator.storage": 2,
    "navigator.serviceWorker": 6,
    "navigator.deviceMemory": 3,
    "navigator.permissions": 3,
    "navigator.usb": 1,
    "navigator.userAgentData": 2,
    "performance.timeOrigin": 2,
    "performance.clearMarks": 2,
    "performance.clearMeasures": 1,
    "performance.getEntriesByType": 9,
    "performance.mark": 14,
    "performance.measure": 3,
    "performance.now": 257,
    "performance.timing": 44,
    "performance.timing.navigationStart": 17,
    "performance.timing.domLoading": 1,
    "performance.timing.domInteractive": 2,
    "performance.timing.domContentLoadedEventStart": 1,
    "performance.timing.domContentLoadedEventEnd": 1,
    "performance.timing.domComplete": 1,
    "performance.timing.loadEventStart": 1,
    "performance.timing.loadEventEnd": 1,
    "Array.prototype.constructor": 2113,
    "Array.prototype.concat": 181,
    "Array.prototype.fill": 73,
    "Array.prototype.find": 44,
    "Array.prototype.findIndex": 1,
    "Array.prototype.pop": 41,
    "Array.prototype.push": 10144,
    "Array.prototype.reverse": 90,
    "Array.prototype.shift": 3879,
    "Array.prototype.unshift": 4,
    "Array.prototype.slice": 1009,
    "Array.prototype.sort": 105,
    "Array.prototype.splice": 236,
    "Array.prototype.includes": 564,
    "Array.prototype.indexOf": 751,
    "Array.prototype.join": 1166,
    "Array.prototype.keys": 6,
    "Array.prototype.entries": 4,
    "Array.prototype.values": 1,
    "Array.prototype.forEach": 451,
    "Array.prototype.filter": 261,
    "Array.prototype.flat": 1,
    "Array.prototype.map": 655,
    "Array.prototype.every": 16,
    "Array.prototype.some": 4,
    "Array.prototype.reduce": 5143,
    "Array.prototype.toString": 15,
    "String.prototype.charAt": 79385,
    "String.prototype.charCodeAt": 55759,
    "String.prototype.concat": 15,
    "String.prototype.endsWith": 17,
    "String.prototype.includes": 1750,
    "String.prototype.indexOf": 154146,
    "String.prototype.lastIndexOf": 34,
    "String.prototype.match": 519,
    "String.prototype.matchAll": 19,
    "String.prototype.normalize": 58,
    "String.prototype.repeat": 2,
    "String.prototype.replace": 2543,
    "String.prototype.search": 7,
    "String.prototype.slice": 54556,
    "String.prototype.split": 1231,
    "String.prototype.substr": 211,
    "String.prototype.substring": 62,
    "String.prototype.startsWith": 78,
    "String.prototype.toString": 14,
    "String.prototype.trim": 958,
    "String.prototype.toLocaleLowerCase": 100,
    "String.prototype.toLowerCase": 4001,
    "String.prototype.toUpperCase": 14,
    "Object.prototype.constructor": 362,
    "Object.prototype.hasOwnProperty": 9133,
    "Object.prototype.propertyIsEnumerable": 5,
    "Object.prototype.toString": 943,
    "Object.prototype.valueOf": 582,
    "Object.prototype.__proto__": 3,
    "document.featurePolicy": 4
}

@pmeenan
Copy link
Member

pmeenan commented May 24, 2022

I'm still wondering if there is value in quantity over quality. Even lightweight, is it useful to know which properties are used most often?

For some of the sensitive ones, like window.navigator, I could see there being more value in a more-expensive hook that gets the call stack and counts occurrences by script origin. (new Error()).stack Should do it from what I can tell but you wouldn't want to do that for every method. In the case of navigator, it could identify the analytics scripts, etc instead of the origins and see if there is a smaller set of companies that would be impacted by anonymization efforts.

@rviscomi rviscomi mentioned this pull request May 25, 2022
5 tasks
@rviscomi rviscomi marked this pull request as ready for review May 25, 2022 18:40
@rviscomi rviscomi requested a review from pmeenan May 25, 2022 19:11
@rviscomi
Copy link
Member Author

rviscomi commented May 25, 2022

I reduced the amount of noise in my local tests by renaming the WPT metric name to 00_reset rather than just reset. But there's still some stuff getting picked up, presumably caused by WPT itself:

Test results for example.com:

{
    "call_stacks": {
        "navigator.userAgent": []
    },
    "performance.clearMarks": 1,
    "performance.clearMeasures": 1,
    "performance.getEntriesByType": 5,
    "performance.timing": 9,
    "performance.timing.domInteractive": 1,
    "performance.timing.domContentLoadedEventStart": 1,
    "performance.timing.domContentLoadedEventEnd": 1,
    "performance.timing.domComplete": 1,
    "performance.timing.loadEventStart": 1,
    "performance.timing.loadEventEnd": 1,
    "Array.prototype.indexOf": 182,
    "String.prototype.match": 50,
    "String.prototype.substring": 20
}

@pmeenan I assume there's not much we can do about those besides subtracting after the fact.

@pmeenan
Copy link
Member

pmeenan commented May 25, 2022

@rviscomi we may be able to move the WPT metrics collection to be after running the custom metrics but that will open it up to a little risk of custom metrics breaking the WPT metrics (mostly marks/measures if a custom metric does anything destructive)

@rviscomi
Copy link
Member Author

For our private instance, how feasible would it be for WPT code to execute between toggling httparchive_enable_observations? Not a big deal as long as we have a consistent way to mask out the WPT observations, but not sure about "consistent".

@pmeenan
Copy link
Member

pmeenan commented May 26, 2022

I moved things around a bit to minimize the amount of agent logic between the scripts being injected and the custom metrics.

Updated test for example.com

{
  "call_stacks": {
    "navigator.userAgent": []
  },
  "Array.prototype.indexOf": 182,
  "String.prototype.match": 50,
  "String.prototype.substring": 20
}

Not sure where those uses are coming from but it's possible some of them are from the injected script itself.

@rviscomi
Copy link
Member Author

rviscomi commented May 26, 2022

Added them to the props to trace 😄

const PROPERTIES_TO_TRACE = new Set([
  'navigator.userAgent',
  'String.prototype.substring',
  'String.prototype.match',
  'Array.prototype.indexOf'
]);

Results

{
    "call_stacks": {
        "navigator.userAgent": [],
        "Array.prototype.indexOf": {
            "Error\n at Array.get (<anonymous>:99:19)\n at WptAgentFlatten (<anonymous>:32:50)\n at WptAgentReportPerformanceTiming (<anonymous>:50:90)\n at PerformanceObserver.<anonymous> (<anonymous>:55:5)": 5,
            "Error\n at Array.get (<anonymous>:99:19)\n at WptAgentFlatten (<anonymous>:16:75)\n at WptAgentReportPerformanceTiming (<anonymous>:50:90)\n at PerformanceObserver.<anonymous> (<anonymous>:55:5)": 1,
            "Error\n at Array.get (<anonymous>:99:19)\n at WptAgentFlatten (<anonymous>:32:50)\n at WptAgentFlatten (<anonymous>:17:33)\n at WptAgentReportPerformanceTiming (<anonymous>:50:90)\n at PerformanceObserver.<anonymous> (<anonymous>:55:5)": 11,
            "Error\n at Array.get (<anonymous>:99:19)\n at WptAgentFlatten (<anonymous>:16:75)\n at WptAgentFlatten (<anonymous>:17:33)\n at WptAgentReportPerformanceTiming (<anonymous>:50:90)\n at PerformanceObserver.<anonymous> (<anonymous>:55:5)": 165
        },
        "String.prototype.match": {
            "Error\n at String.get (<anonymous>:99:19)\n at WptAgentFlatten (<anonymous>:40:22)\n at WptAgentReportPerformanceTiming (<anonymous>:50:90)\n at PerformanceObserver.<anonymous> (<anonymous>:55:5)": 9,
            "Error\n at String.get (<anonymous>:99:19)\n at WptAgentFlatten (<anonymous>:40:22)\n at WptAgentFlatten (<anonymous>:17:33)\n at WptAgentReportPerformanceTiming (<anonymous>:50:90)\n at PerformanceObserver.<anonymous> (<anonymous>:55:5)": 41
        },
        "String.prototype.substring": {
            "Error\n at String.get (<anonymous>:99:19)\n at WptAgentFlatten (<anonymous>:33:33)\n at WptAgentReportPerformanceTiming (<anonymous>:50:90)\n at PerformanceObserver.<anonymous> (<anonymous>:55:5)": 5,
            "Error\n at String.get (<anonymous>:99:19)\n at WptAgentFlatten (<anonymous>:36:49)\n at WptAgentReportPerformanceTiming (<anonymous>:50:90)\n at PerformanceObserver.<anonymous> (<anonymous>:55:5)": 5,
            "Error\n at String.get (<anonymous>:99:19)\n at WptAgentFlatten (<anonymous>:33:33)\n at WptAgentFlatten (<anonymous>:17:33)\n at WptAgentReportPerformanceTiming (<anonymous>:50:90)\n at PerformanceObserver.<anonymous> (<anonymous>:55:5)": 5,
            "Error\n at String.get (<anonymous>:99:19)\n at WptAgentFlatten (<anonymous>:36:49)\n at WptAgentFlatten (<anonymous>:17:33)\n at WptAgentReportPerformanceTiming (<anonymous>:50:90)\n at PerformanceObserver.<anonymous> (<anonymous>:55:5)": 5
        }
    },
    "Array.prototype.indexOf": 182,
    "String.prototype.match": 50,
    "String.prototype.substring": 20
}

@pmeenan
Copy link
Member

pmeenan commented May 26, 2022

Ahh, looks like it is all from the injected performance observer that gets the LCP and CLS element details at the time of the event.

We can probably update the injected script to either disable/re-enable measurement when it is handling an event or bypass the overrides to call the native methods directly.

@rviscomi
Copy link
Member Author

Could that execute after custom metrics? 🤔

@pmeenan
Copy link
Member

pmeenan commented May 26, 2022

No, it has to execute while the page is loading so it can get the state of the LCP element at the time the event fires.

@pmeenan
Copy link
Member

pmeenan commented May 26, 2022

Tweaking the inject script to remove as many instrumented methods as possible (switching to comparisons insted of indexof, etc). I'm down to one substring call now.

@rviscomi
Copy link
Member Author

I wouldn't worry too much about that since this list of observers may grow in the future. I think we'll need a way to detect when a feature is used directly by WPT and ignore it. It'd add a lot of overhead but we can get call stacks for every feature and look for WPT keywords. WDYT?

@pmeenan
Copy link
Member

pmeenan commented May 26, 2022

For now we're in good shape. Updated test

{"call_stacks":{"navigator.userAgent":[]}}

I prefer that we be careful about the methods that we instrument to make sure there is enough of a ROI/use case to measure them before we talk about adding more overhead to each event because adding call stacks to every string and array method access is going to add SIGNIFICANT overhead to some sites.

I like what we did with navigator.userAgent because we have an explicit interest from the privacy analytics for seeing what specific scripts are fingerprinting.

On the call-stacks side of things, I think we want to do some agent-side processing on those as well to pull out just the top-level origin of the URL of the calling script (maybe in addition to the full stack) so it is easy to query.

@rviscomi
Copy link
Member Author

I prefer that we be careful about the methods that we instrument to make sure there is enough of a ROI/use case to measure them before we talk about adding more overhead to each event because adding call stacks to every string and array method access is going to add SIGNIFICANT overhead to some sites.

I like what we did with navigator.userAgent because we have an explicit interest from the privacy analytics for seeing what specific scripts are fingerprinting.

On the call-stacks side of things, I think we want to do some agent-side processing on those as well to pull out just the top-level origin of the URL of the calling script (maybe in addition to the full stack) so it is easy to query.

@pmeenan if you're still ok with the full stack in the results, I think we can add some shared functions on the SQL side to make processing easier. With that, does this PR LGTY?

Copy link
Member

@pmeenan pmeenan left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM.

If you're watching requestIdleCallback, might be good to also watch isInputPending

@rviscomi
Copy link
Member Author

Good suggestion, thanks. Added.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants