diff --git a/docs-developer/CHANGELOG-formats.md b/docs-developer/CHANGELOG-formats.md index cd587209c2..21c7185a5a 100644 --- a/docs-developer/CHANGELOG-formats.md +++ b/docs-developer/CHANGELOG-formats.md @@ -6,6 +6,10 @@ Note that this is not an exhaustive list. Processed profile format upgraders can ## Processed profile format +### Version 58 + +A new `SourceTable` has been added to `profile.shared.sources` to centralize all source file information. The `FuncTable.fileName` field has been replaced with `FuncTable.source`, which references indices in the shared sources table. This change allows storing a UUID per JS source, which will be used for fetching sources. + ### Version 57 The `searchable` property in marker schemas, originally added in version 44, is now removed again. Now all marker fields are searchable. @@ -122,6 +126,10 @@ Older versions are not documented in this changelog but can be found in [process ## Gecko profile format +### Version 32 + +`frameTable` `location` string field was changed to include an optional `sourceIndex` at the end of the string inside brackets for JS sources. For example, new JS frames look like this: `functionName (http://script.url/:1234:1234)[1234]` with the last number being its `sourceIndex`. This index references entries in the shared `SourceTable` in `profile.sources` (added in in the same version) which centralizes all source file information. + ### Version 31 Two new marker schema field format types have been added: `flow-id` and `terminating-flow-id`, with string index values (like `unique-string`). diff --git a/locales/de/app.ftl b/locales/de/app.ftl index 8ec7c862fd..a7733a46a0 100644 --- a/locales/de/app.ftl +++ b/locales/de/app.ftl @@ -39,6 +39,14 @@ AppViewRouter--error-from-localhost-url-safari = Aufgrund einer spezifischen AppViewRouter--route-not-found--home = .specialMessage = Die URL, die Sie erreichen wollten, wurde nicht erkannt. +## Backtrace +## This is used to display a backtrace (call stack) for a marker or sample. + +# Variables: +# $function (String) - Name of the function that was inlined. +Backtrace--inlining-badge = (inlined) + .title = { $function } wurde durch den Compiler zur Inline-Funktion ihres Aufrufers. + ## CallNodeContextMenu ## This is used as a context menu for the Call Tree, Flame Graph and Stack Chart ## panels. @@ -1101,6 +1109,13 @@ SourceView--not-in-archive-error-when-obtaining-source = Die Datei { $pathInArch # $url (String) - The URL from which the "archive" file was downloaded. # $parsingErrorMessage (String) - The raw internal error message during parsing, not localized SourceView--archive-parsing-error-when-obtaining-source = Das Archiv unter { $url } konnte nicht geparst werden: { $parsingErrorMessage } +# Displayed below SourceView--cannot-obtain-source, if a JS file could not be found in +# the browser. +# Variables: +# $url (String) - The URL of the JS source file. +# $sourceUuid (number) - The UUID of the JS source file. +# $errorMessage (String) - The raw internal error message, not localized +SourceView--not-in-browser-error-when-obtaining-js-source = Der Browser konnte die Quelltextdatei für { $url } mit der sourceUuid { $sourceUuid } nicht abrufen: { $errorMessage }. ## Toggle buttons in the top right corner of the bottom box diff --git a/locales/el/app.ftl b/locales/el/app.ftl index 3f27e38828..78a6a1cf4c 100644 --- a/locales/el/app.ftl +++ b/locales/el/app.ftl @@ -1120,6 +1120,13 @@ SourceView--not-in-archive-error-when-obtaining-source = Το αρχείο «{ $ # $url (String) - The URL from which the "archive" file was downloaded. # $parsingErrorMessage (String) - The raw internal error message during parsing, not localized SourceView--archive-parsing-error-when-obtaining-source = Δεν ήταν δυνατή η ανάλυση του αρχείου στο { $url }: { $parsingErrorMessage } +# Displayed below SourceView--cannot-obtain-source, if a JS file could not be found in +# the browser. +# Variables: +# $url (String) - The URL of the JS source file. +# $sourceUuid (number) - The UUID of the JS source file. +# $errorMessage (String) - The raw internal error message, not localized +SourceView--not-in-browser-error-when-obtaining-js-source = Το πρόγραμμα περιήγησης δεν μπόρεσε να λάβει το αρχείο πηγαίου κώδικα για το { $url } με το sourceUuid { $sourceUuid }: { $errorMessage }. ## Toggle buttons in the top right corner of the bottom box diff --git a/locales/en-GB/app.ftl b/locales/en-GB/app.ftl index 6e874d2ea3..0be816d28d 100644 --- a/locales/en-GB/app.ftl +++ b/locales/en-GB/app.ftl @@ -42,6 +42,14 @@ AppViewRouter--error-from-localhost-url-safari = AppViewRouter--route-not-found--home = .specialMessage = The URL you tried to reach was not recognised. +## Backtrace +## This is used to display a backtrace (call stack) for a marker or sample. + +# Variables: +# $function (String) - Name of the function that was inlined. +Backtrace--inlining-badge = (inlined) + .title = { $function } was inlined into its caller by the compiler. + ## CallNodeContextMenu ## This is used as a context menu for the Call Tree, Flame Graph and Stack Chart ## panels. @@ -1125,6 +1133,13 @@ SourceView--not-in-archive-error-when-obtaining-source = The file { $pathInArchi # $url (String) - The URL from which the "archive" file was downloaded. # $parsingErrorMessage (String) - The raw internal error message during parsing, not localized SourceView--archive-parsing-error-when-obtaining-source = The archive at { $url } could not be parsed: { $parsingErrorMessage } +# Displayed below SourceView--cannot-obtain-source, if a JS file could not be found in +# the browser. +# Variables: +# $url (String) - The URL of the JS source file. +# $sourceUuid (number) - The UUID of the JS source file. +# $errorMessage (String) - The raw internal error message, not localized +SourceView--not-in-browser-error-when-obtaining-js-source = The browser was unable to obtain the source file for { $url } with sourceUuid { $sourceUuid }: { $errorMessage }. ## Toggle buttons in the top right corner of the bottom box diff --git a/locales/en-US/app.ftl b/locales/en-US/app.ftl index 748963e31f..336411c89d 100644 --- a/locales/en-US/app.ftl +++ b/locales/en-US/app.ftl @@ -47,6 +47,14 @@ AppViewRouter--error-from-localhost-url-safari = AppViewRouter--route-not-found--home = .specialMessage = The URL you tried to reach was not recognized. +## Backtrace +## This is used to display a backtrace (call stack) for a marker or sample. + +# Variables: +# $function (String) - Name of the function that was inlined. +Backtrace--inlining-badge = (inlined) + .title = { $function } was inlined into its caller by the compiler. + ## CallNodeContextMenu ## This is used as a context menu for the Call Tree, Flame Graph and Stack Chart ## panels. @@ -483,6 +491,16 @@ MarkerTable--duration = Duration MarkerTable--name = Name MarkerTable--details = Details +## MarkerTooltip +## This is the component for Marker Tooltip panel. + +# This is used as the tooltip for the filter button in marker tooltips. +# Variables: +# $filter (String) - Search string that will be used to filter the markers. +MarkerTooltip--filter-button-tooltip = + .title = Only show markers matching: “{ $filter }” + .aria-label = Only show markers matching: “{ $filter }” + ## MenuButtons ## These strings are used for the buttons at the top of the profile viewer. @@ -1243,6 +1261,15 @@ SourceView--not-in-archive-error-when-obtaining-source = SourceView--archive-parsing-error-when-obtaining-source = The archive at { $url } could not be parsed: { $parsingErrorMessage } +# Displayed below SourceView--cannot-obtain-source, if a JS file could not be found in +# the browser. +# Variables: +# $url (String) - The URL of the JS source file. +# $sourceUuid (number) - The UUID of the JS source file. +# $errorMessage (String) - The raw internal error message, not localized +SourceView--not-in-browser-error-when-obtaining-js-source = + The browser was unable to obtain the source file for { $url } with sourceUuid { $sourceUuid }: { $errorMessage }. + ## Toggle buttons in the top right corner of the bottom box # The toggle button for the assembly view, while the assembly view is hidden. diff --git a/locales/es-CL/app.ftl b/locales/es-CL/app.ftl index e35a4738b4..b1ecf4ba4d 100644 --- a/locales/es-CL/app.ftl +++ b/locales/es-CL/app.ftl @@ -1052,6 +1052,13 @@ SourceView--not-in-archive-error-when-obtaining-source = El documento { $pathInA # $url (String) - The URL from which the "archive" file was downloaded. # $parsingErrorMessage (String) - The raw internal error message during parsing, not localized SourceView--archive-parsing-error-when-obtaining-source = El archivo de { $url } no pudo ser analizado: { $parsingErrorMessage } +# Displayed below SourceView--cannot-obtain-source, if a JS file could not be found in +# the browser. +# Variables: +# $url (String) - The URL of the JS source file. +# $sourceUuid (number) - The UUID of the JS source file. +# $errorMessage (String) - The raw internal error message, not localized +SourceView--not-in-browser-error-when-obtaining-js-source = El navegador no pudo obtener el archivo fuente de { $url } con sourceUuid { $sourceUuid }: { $errorMessage }. ## Toggle buttons in the top right corner of the bottom box diff --git a/locales/fr/app.ftl b/locales/fr/app.ftl index 85b791b41d..84068f8ab7 100644 --- a/locales/fr/app.ftl +++ b/locales/fr/app.ftl @@ -1046,6 +1046,13 @@ SourceView--not-in-archive-error-when-obtaining-source = Le fichier { $pathInArc # $url (String) - The URL from which the "archive" file was downloaded. # $parsingErrorMessage (String) - The raw internal error message during parsing, not localized SourceView--archive-parsing-error-when-obtaining-source = L’archive à l’adresse { $url } n’a pas pu être analysée : { $parsingErrorMessage } +# Displayed below SourceView--cannot-obtain-source, if a JS file could not be found in +# the browser. +# Variables: +# $url (String) - The URL of the JS source file. +# $sourceUuid (number) - The UUID of the JS source file. +# $errorMessage (String) - The raw internal error message, not localized +SourceView--not-in-browser-error-when-obtaining-js-source = Le navigateur n’a pas pu obtenir le fichier source pour { $url } avec l’identifiant sourceUuid { $sourceUuid } : { $errorMessage }. ## Toggle buttons in the top right corner of the bottom box diff --git a/locales/fur/app.ftl b/locales/fur/app.ftl index be9c3b39b4..1bb4435a6a 100644 --- a/locales/fur/app.ftl +++ b/locales/fur/app.ftl @@ -1085,6 +1085,13 @@ SourceView--not-in-archive-error-when-obtaining-source = Il file { $pathInArchiv # $url (String) - The URL from which the "archive" file was downloaded. # $parsingErrorMessage (String) - The raw internal error message during parsing, not localized SourceView--archive-parsing-error-when-obtaining-source = Impussibil analizâ l’archivi in { $url }: { $parsingErrorMessage } +# Displayed below SourceView--cannot-obtain-source, if a JS file could not be found in +# the browser. +# Variables: +# $url (String) - The URL of the JS source file. +# $sourceUuid (number) - The UUID of the JS source file. +# $errorMessage (String) - The raw internal error message, not localized +SourceView--not-in-browser-error-when-obtaining-js-source = Il navigadôr nol è rivât a otignî il file sorzint par { $url } cun sourceUuid { $sourceUuid }: { $errorMessage }. ## Toggle buttons in the top right corner of the bottom box diff --git a/locales/fy-NL/app.ftl b/locales/fy-NL/app.ftl index 892e57251f..f0a484c98f 100644 --- a/locales/fy-NL/app.ftl +++ b/locales/fy-NL/app.ftl @@ -42,6 +42,14 @@ AppViewRouter--error-from-localhost-url-safari = AppViewRouter--route-not-found--home = .specialMessage = De URL dy’t jo probearre te berikken, waard net werkend. +## Backtrace +## This is used to display a backtrace (call stack) for a marker or sample. + +# Variables: +# $function (String) - Name of the function that was inlined. +Backtrace--inlining-badge = (inline pleatst) + .title = { $function } is troch de compiler inline yn de oanropomjouwing pleatst + ## CallNodeContextMenu ## This is used as a context menu for the Call Tree, Flame Graph and Stack Chart ## panels. @@ -1125,6 +1133,13 @@ SourceView--not-in-archive-error-when-obtaining-source = It bestân { $pathInArc # $url (String) - The URL from which the "archive" file was downloaded. # $parsingErrorMessage (String) - The raw internal error message during parsing, not localized SourceView--archive-parsing-error-when-obtaining-source = It argyf op { $url } koe net ferwurke wurde: { $parsingErrorMessage } +# Displayed below SourceView--cannot-obtain-source, if a JS file could not be found in +# the browser. +# Variables: +# $url (String) - The URL of the JS source file. +# $sourceUuid (number) - The UUID of the JS source file. +# $errorMessage (String) - The raw internal error message, not localized +SourceView--not-in-browser-error-when-obtaining-js-source = De browser koe it boarnebestân foar { $url } mei sourceUuid { $sourceUuid } net krije: { $errorMessage }. ## Toggle buttons in the top right corner of the bottom box diff --git a/locales/ia/app.ftl b/locales/ia/app.ftl index f42cd0c066..fe7749914d 100644 --- a/locales/ia/app.ftl +++ b/locales/ia/app.ftl @@ -42,6 +42,14 @@ AppViewRouter--error-from-localhost-url-safari = AppViewRouter--route-not-found--home = .specialMessage = Le URL que tu tentava attinger non ha essite recognoscite. +## Backtrace +## This is used to display a backtrace (call stack) for a marker or sample. + +# Variables: +# $function (String) - Name of the function that was inlined. +Backtrace--inlining-badge = (incorporate) + .title = { $function } era incorporate in su appellator per le compilator. + ## CallNodeContextMenu ## This is used as a context menu for the Call Tree, Flame Graph and Stack Chart ## panels. @@ -1108,6 +1116,13 @@ SourceView--not-in-archive-error-when-obtaining-source = Le file { $pathInArchiv # $url (String) - The URL from which the "archive" file was downloaded. # $parsingErrorMessage (String) - The raw internal error message during parsing, not localized SourceView--archive-parsing-error-when-obtaining-source = Le archivo a { $url } non pote esser tractate: { $parsingErrorMessage } +# Displayed below SourceView--cannot-obtain-source, if a JS file could not be found in +# the browser. +# Variables: +# $url (String) - The URL of the JS source file. +# $sourceUuid (number) - The UUID of the JS source file. +# $errorMessage (String) - The raw internal error message, not localized +SourceView--not-in-browser-error-when-obtaining-js-source = Il browser non succedeva obtener le file fonte pro { $url } con sourceUuid { $sourceUuid }: { $errorMessage }. ## Toggle buttons in the top right corner of the bottom box diff --git a/locales/it/app.ftl b/locales/it/app.ftl index 058d1f73ba..8cf025594a 100644 --- a/locales/it/app.ftl +++ b/locales/it/app.ftl @@ -39,6 +39,14 @@ AppViewRouter--error-from-localhost-url-safari = A causa di una limitazione s AppViewRouter--route-not-found--home = .specialMessage = L’URL che hai cercato di raggiungere non è stato riconosciuto. +## Backtrace +## This is used to display a backtrace (call stack) for a marker or sample. + +# Variables: +# $function (String) - Name of the function that was inlined. +Backtrace--inlining-badge = (incorporata) + .title = { $function } è stata incorporata nel chiamante dal compilatore. + ## CallNodeContextMenu ## This is used as a context menu for the Call Tree, Flame Graph and Stack Chart ## panels. @@ -1037,6 +1045,13 @@ SourceView--not-in-archive-error-when-obtaining-source = Il file { $pathInArchiv # $url (String) - The URL from which the "archive" file was downloaded. # $parsingErrorMessage (String) - The raw internal error message during parsing, not localized SourceView--archive-parsing-error-when-obtaining-source = Impossibile analizzare l’archivio in { $url }: { $parsingErrorMessage } +# Displayed below SourceView--cannot-obtain-source, if a JS file could not be found in +# the browser. +# Variables: +# $url (String) - The URL of the JS source file. +# $sourceUuid (number) - The UUID of the JS source file. +# $errorMessage (String) - The raw internal error message, not localized +SourceView--not-in-browser-error-when-obtaining-js-source = Il browser non è riuscito a ottenere il file sorgente per { $url } con sourceUuid { $sourceUuid }: { $errorMessage }. ## Toggle buttons in the top right corner of the bottom box diff --git a/locales/nl/app.ftl b/locales/nl/app.ftl index a11541fb9b..c8c53ff0c8 100644 --- a/locales/nl/app.ftl +++ b/locales/nl/app.ftl @@ -42,6 +42,14 @@ AppViewRouter--error-from-localhost-url-safari = AppViewRouter--route-not-found--home = .specialMessage = De URL die u probeerde te bereiken, werd niet herkend. +## Backtrace +## This is used to display a backtrace (call stack) for a marker or sample. + +# Variables: +# $function (String) - Name of the function that was inlined. +Backtrace--inlining-badge = (inline geplaatst) + .title = { $function } is door de compiler inline in de aanroepomgeving geplaatst + ## CallNodeContextMenu ## This is used as a context menu for the Call Tree, Flame Graph and Stack Chart ## panels. @@ -1125,6 +1133,13 @@ SourceView--not-in-archive-error-when-obtaining-source = Het bestand { $pathInAr # $url (String) - The URL from which the "archive" file was downloaded. # $parsingErrorMessage (String) - The raw internal error message during parsing, not localized SourceView--archive-parsing-error-when-obtaining-source = Het archief op { $url } kan niet worden ontleed: { $parsingErrorMessage } +# Displayed below SourceView--cannot-obtain-source, if a JS file could not be found in +# the browser. +# Variables: +# $url (String) - The URL of the JS source file. +# $sourceUuid (number) - The UUID of the JS source file. +# $errorMessage (String) - The raw internal error message, not localized +SourceView--not-in-browser-error-when-obtaining-js-source = De browser kon het bronbestand voor { $url } met sourceUuid { $sourceUuid } niet verkrijgen: { $errorMessage }. ## Toggle buttons in the top right corner of the bottom box diff --git a/locales/pt-BR/app.ftl b/locales/pt-BR/app.ftl index bb51d92ba3..01dc2a81ea 100644 --- a/locales/pt-BR/app.ftl +++ b/locales/pt-BR/app.ftl @@ -1048,6 +1048,13 @@ SourceView--not-in-archive-error-when-obtaining-source = O arquivo { $pathInArch # $url (String) - The URL from which the "archive" file was downloaded. # $parsingErrorMessage (String) - The raw internal error message during parsing, not localized SourceView--archive-parsing-error-when-obtaining-source = O pacote em { $url } não pôde ser analisado: { $parsingErrorMessage } +# Displayed below SourceView--cannot-obtain-source, if a JS file could not be found in +# the browser. +# Variables: +# $url (String) - The URL of the JS source file. +# $sourceUuid (number) - The UUID of the JS source file. +# $errorMessage (String) - The raw internal error message, not localized +SourceView--not-in-browser-error-when-obtaining-js-source = O navegador não conseguiu obter o arquivo fonte de { $url } com sourceUuid { $sourceUuid }: { $errorMessage }. ## Toggle buttons in the top right corner of the bottom box diff --git a/locales/ru/app.ftl b/locales/ru/app.ftl index 013354911e..d1fbb57896 100644 --- a/locales/ru/app.ftl +++ b/locales/ru/app.ftl @@ -42,6 +42,14 @@ AppViewRouter--error-from-localhost-url-safari = AppViewRouter--route-not-found--home = .specialMessage = URL-адрес, который вы пытались открыть, не был распознан. +## Backtrace +## This is used to display a backtrace (call stack) for a marker or sample. + +# Variables: +# $function (String) - Name of the function that was inlined. +Backtrace--inlining-badge = (встроенный) + .title = { $function } был встроен компилятором в вызывающий объект. + ## CallNodeContextMenu ## This is used as a context menu for the Call Tree, Flame Graph and Stack Chart ## panels. @@ -1134,6 +1142,13 @@ SourceView--not-in-archive-error-when-obtaining-source = Файл { $pathInArchi # $url (String) - The URL from which the "archive" file was downloaded. # $parsingErrorMessage (String) - The raw internal error message during parsing, not localized SourceView--archive-parsing-error-when-obtaining-source = Архив по адресу { $url } не может быть проанализирован: { $parsingErrorMessage } +# Displayed below SourceView--cannot-obtain-source, if a JS file could not be found in +# the browser. +# Variables: +# $url (String) - The URL of the JS source file. +# $sourceUuid (number) - The UUID of the JS source file. +# $errorMessage (String) - The raw internal error message, not localized +SourceView--not-in-browser-error-when-obtaining-js-source = Браузер не смог получить исходный файл для { $url } с sourceUuid { $sourceUuid }: { $errorMessage }. ## Toggle buttons in the top right corner of the bottom box diff --git a/locales/sv-SE/app.ftl b/locales/sv-SE/app.ftl index 540787b6a1..882fa9d3a6 100644 --- a/locales/sv-SE/app.ftl +++ b/locales/sv-SE/app.ftl @@ -42,6 +42,14 @@ AppViewRouter--error-from-localhost-url-safari = AppViewRouter--route-not-found--home = .specialMessage = Webbadressen du försökte nå kändes inte igen. +## Backtrace +## This is used to display a backtrace (call stack) for a marker or sample. + +# Variables: +# $function (String) - Name of the function that was inlined. +Backtrace--inlining-badge = (infogad) + .title = { $function } infogades i sin anropare av kompilatorn. + ## CallNodeContextMenu ## This is used as a context menu for the Call Tree, Flame Graph and Stack Chart ## panels. @@ -1120,6 +1128,13 @@ SourceView--not-in-archive-error-when-obtaining-source = Filen { $pathInArchive # $url (String) - The URL from which the "archive" file was downloaded. # $parsingErrorMessage (String) - The raw internal error message during parsing, not localized SourceView--archive-parsing-error-when-obtaining-source = Arkivet på { $url } kunde inte analyseras: { $parsingErrorMessage } +# Displayed below SourceView--cannot-obtain-source, if a JS file could not be found in +# the browser. +# Variables: +# $url (String) - The URL of the JS source file. +# $sourceUuid (number) - The UUID of the JS source file. +# $errorMessage (String) - The raw internal error message, not localized +SourceView--not-in-browser-error-when-obtaining-js-source = Webbläsaren kunde inte hämta källfilen för { $url } med sourceUuid { $sourceUuid }: { $errorMessage }. ## Toggle buttons in the top right corner of the bottom box diff --git a/locales/tr/app.ftl b/locales/tr/app.ftl index ab0346a690..17a95499ea 100644 --- a/locales/tr/app.ftl +++ b/locales/tr/app.ftl @@ -74,6 +74,8 @@ CallNodeContextMenu--transform-focus-subtree = Yalnızca alt ağaca odaklan # $categoryName (String) - Name of the category to focus on. CallNodeContextMenu--transform-focus-category = { $categoryName } kategorisine odaklan .title = Seçilen düğümle aynı kategorideki düğümlere odaklanarak diğer kategorilere ait tüm düğümleri birleştirir. +CallNodeContextMenu--transform-collapse-function-subtree = Fonksiyonu daralt + .title = Bir fonksiyonu daraltmak o fonksiyonun çağırdığı her şeyi kaldıracak ve bütün süreyi fonskiyona atayacaktır. Bu işlem, analiz edilmesi gerekmeyen kodlara çağrı yapan bir profilin basitleştirilmesini sağlayabilir. # This is used as the context menu item to apply the "Collapse resource" transform. # Variables: # $nameForResource (String) - Name of the resource to collapse. @@ -96,6 +98,14 @@ CallNodeContextMenu--copy-script-url = Betik URL’sini kopyala CallNodeContextMenu--copy-stack = Yığını kopyala CallNodeContextMenu--show-the-function-in-devtools = Fonksiyonu geliştirici araçlarında göster +## CallTree +## This is the component for Call Tree panel. + +CallTree--tracing-ms-total = Çalışma süresi (ms) + .title = “Toplam” çalışma süresi, bu fonksiyonun yığında gözlemlendiği tüm sürenin özetini içerir. Bu süre, fonksiyonun kendisinin çalıştığı süreyi ve bu fonksiyondan çağırılanların sürelerini içerir. +CallTree--tracing-ms-self = Öz (ms) + .title = “Öz” süre yalnızca fonksiyonun yığının sonunda olduğu süreyi içerir. Eğer fonksiyon başka fonksiyonları çağırmışsa diğer fonksiyonların süresi dahil değildir. Öz süre, programda asıl nerede zaman harcandığını anlamak için faydalıdır. + ## Call tree "badges" (icons) with tooltips ## ## These inlining badges are displayed in the call tree in front of some @@ -129,6 +139,8 @@ CallTreeSidebar--call-node-details = Çağrı düğümü ayrıntıları CallTreeSidebar--traced-running-time = .label = İzlenen çalışma süresi +CallTreeSidebar--traced-self-time = + .label = İzlenen öz süre CallTreeSidebar--running-time = .label = Çalışma süresi CallTreeSidebar--self-time = @@ -233,6 +245,13 @@ Home--profile-firefox-android-instructions = # of the "Enable Firefox Profiler menu button" button. Home--enable-button-unavailable = .title = Bu profilleyici örneği WebChannel’a bağlanamadığı için profilleyici menü düğmesini etkinleştiremez. +# The word WebChannel, the pref name, and the string "about:config" should not be translated. +# This message can be seen on https://main--perf-html.netlify.app/ . +Home--web-channel-unavailable = Bu profilleyici örneği WebChannel’a bağlanamadı. Genellikle bunun sebebi, devtools.performance.recording.ui-base-url tercihinde belirtilenden farklı bir sunucuda çalışmasıdır. Bu örnekle yeni profiller kaydetmek ve profilleyici menü düğmesinin programatik kontrolünü bu örneğe vermek isterseniz about:config adresine gidip tercihinizi değiştirebilirsiniz. +Home--record-instructions = + Profillemeyi başlatmak için profilleme düğmesine tıklayın veya + klavye kısayollarını kullanın. Profil kaydedilirken simge maviye dönüşür. + Verileri profiler.firefox.com’a yüklemek için Kaydet’e tıklayın. Home--instructions-content = Performans profilleri yalnızca { -firefox-brand-name } ile kaydedilebilir. Ancak mevcut profiller herhangi bir modern tarayıcıda görüntülenebilir. @@ -243,6 +262,9 @@ Home--additional-content-title = Mevcut profilleri yükleyin Home--additional-content-content = Profil dosyasını buraya sürükleyip bırakarak yükleyebilirsiniz ya da: Home--compare-recordings-info = Ayrıca kayıtları karşılaştırabilirsiniz. Karşılaştırma arayüzünü aç. Home--your-recent-uploaded-recordings-title = Son yüklediğiniz kayıtlar +# We replace the elements such as and with links to the +# documentation to use these tools. +Home--load-files-from-other-tools2 = { -profiler-brand-name } ayrıca Linux perf, Android SimplePerf, Chrome performans paneli, Android Studio gibi diğer profilleyicilerden ve dhat biçimini veya Google’ın trace etkinliği biçimini kullanan herhangi bir dosyadan profilleri içe aktarabilir. Kendi içe aktarıcınızı yazmayı öğrenin. Home--install-chrome-extension = Chrome uzantısını yükle Home--chrome-extension-instructions = Chrome’daki performans profillerini kaydedip { -profiler-brand-name }’da analiz etmek için Chrome { -profiler-brand-name } uzantısını kullanabilirsiniz. Uzantıyı Chrome Web Store'dan yükleyebilirsiniz. Home--chrome-extension-recording-instructions = @@ -256,6 +278,12 @@ Home--chrome-extension-recording-instructions = IdleSearchField--search-input = .placeholder = Filtre terimlerini girin +## JsTracerSettings +## JSTracer is an experimental feature and it's currently disabled. See Bug 1565788. + +JsTracerSettings--show-only-self-time = Yalnızca öz süreyi göster + .title = Yalnızca çağrı düğümünde harcanan zamanı göster, alt düğümleri göz ardı et. + ## ListOfPublishedProfiles ## This is the component that displays all the profiles the user has uploaded. ## It's displayed both in the homepage and in the uploaded recordings page. @@ -623,6 +651,7 @@ StackSettings--implementation-native2 = Yerel StackSettings--stack-implementation-label = Yığın filtresi: StackSettings--use-data-source-label = Veri kaynağı: StackSettings--show-user-timing = Kullanıcı zamanlamasını göster +StackSettings--use-stack-chart-same-widths = Her yığın için aynı genişliği kullan StackSettings--panel-search = .label = Yığınları filtrele: .title = Yalnızca adı bu alt dizgiyle eşleşen bir fonksiyon içeren yığınları görüntüler @@ -687,7 +716,9 @@ TrackNameButton--hide-process = ## the UI. To learn more about it, visit: ## https://profiler.firefox.com/docs/#/./memory-allocations?id=memory-track +TrackMemoryGraph--relative-memory-at-this-time = bu süredeki göreli bellek TrackMemoryGraph--memory-range-in-graph = grafikteki bellek aralığı +TrackMemoryGraph--allocations-and-deallocations-since-the-previous-sample = önceki örnekten beri yapılan atamalar ve serbest bırakmalar ## TrackPower ## This is used to show the power used by the CPU and other chips in a computer, diff --git a/locales/zh-CN/app.ftl b/locales/zh-CN/app.ftl index 3318c142bb..29646aed80 100644 --- a/locales/zh-CN/app.ftl +++ b/locales/zh-CN/app.ftl @@ -1028,6 +1028,13 @@ SourceView--not-in-archive-error-when-obtaining-source = { $url } 处的存档 # $url (String) - The URL from which the "archive" file was downloaded. # $parsingErrorMessage (String) - The raw internal error message during parsing, not localized SourceView--archive-parsing-error-when-obtaining-source = 无法解析 { $url } 处的存档:{ $parsingErrorMessage } +# Displayed below SourceView--cannot-obtain-source, if a JS file could not be found in +# the browser. +# Variables: +# $url (String) - The URL of the JS source file. +# $sourceUuid (number) - The UUID of the JS source file. +# $errorMessage (String) - The raw internal error message, not localized +SourceView--not-in-browser-error-when-obtaining-js-source = 浏览器无法获取位置为 { $url }、sourceUuid 为 { $sourceUuid } 的源代码文件:{ $errorMessage }。 ## Toggle buttons in the top right corner of the bottom box diff --git a/locales/zh-TW/app.ftl b/locales/zh-TW/app.ftl index 43d6d10df1..ca75bd3d5e 100644 --- a/locales/zh-TW/app.ftl +++ b/locales/zh-TW/app.ftl @@ -39,6 +39,14 @@ AppViewRouter--error-from-localhost-url-safari = 由於 Safari 的特殊限 AppViewRouter--route-not-found--home = .specialMessage = 無法處理您嘗試開啟的網址。 +## Backtrace +## This is used to display a backtrace (call stack) for a marker or sample. + +# Variables: +# $function (String) - Name of the function that was inlined. +Backtrace--inlining-badge = (內聯) + .title = 編譯器將 { $function } 內聯到呼叫它的函式中。 + ## CallNodeContextMenu ## This is used as a context menu for the Call Tree, Flame Graph and Stack Chart ## panels. @@ -1027,6 +1035,13 @@ SourceView--not-in-archive-error-when-obtaining-source = 下載自 { $url } 的 # $url (String) - The URL from which the "archive" file was downloaded. # $parsingErrorMessage (String) - The raw internal error message during parsing, not localized SourceView--archive-parsing-error-when-obtaining-source = 無法剖析下載自 { $url } 的封存檔:{ $parsingErrorMessage } +# Displayed below SourceView--cannot-obtain-source, if a JS file could not be found in +# the browser. +# Variables: +# $url (String) - The URL of the JS source file. +# $sourceUuid (number) - The UUID of the JS source file. +# $errorMessage (String) - The raw internal error message, not localized +SourceView--not-in-browser-error-when-obtaining-js-source = 瀏覽器無法取得 sourceUuid 為 { $sourceUuid },位於 { $url } 的原始碼檔案:{ $errorMessage }。 ## Toggle buttons in the top right corner of the bottom box diff --git a/package.json b/package.json index c5697c654a..206786bf6c 100644 --- a/package.json +++ b/package.json @@ -63,13 +63,13 @@ "@codemirror/lang-rust": "^6.0.2", "@codemirror/language": "^6.11.3", "@codemirror/state": "^6.5.2", - "@codemirror/view": "^6.38.2", + "@codemirror/view": "^6.38.4", "@firefox-devtools/react-contextmenu": "^5.2.3", "@fluent/bundle": "^0.19.1", "@fluent/langneg": "^0.7.0", "@fluent/react": "^0.15.2", "@lezer/highlight": "^1.2.1", - "@tgwf/co2": "^0.16.8", + "@tgwf/co2": "^0.16.9", "array-move": "^3.0.1", "array-range": "^1.0.1", "clamp": "^1.0.1", @@ -80,7 +80,7 @@ "escape-string-regexp": "^4.0.0", "gecko-profiler-demangle": "^0.4.0", "idb": "^8.0.3", - "iongraph-web": "0.1.15", + "iongraph-web": "0.1.16", "jszip": "^3.10.1", "long": "^5.3.2", "memoize-immutable": "^3.0.0", @@ -90,7 +90,7 @@ "namedtuplemap": "^1.0.0", "photon-colors": "^3.3.2", "protobufjs": "^7.5.4", - "query-string": "^9.2.2", + "query-string": "^9.3.1", "react": "^18.3.1", "react-dom": "^18.3.1", "react-intersection-observer": "^9.16.0", @@ -107,46 +107,46 @@ }, "devDependencies": { "@babel/cli": "^7.28.3", - "@babel/core": "^7.28.3", - "@babel/eslint-parser": "^7.28.0", + "@babel/core": "^7.28.4", + "@babel/eslint-parser": "^7.28.4", "@babel/eslint-plugin": "^7.27.1", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/preset-env": "^7.28.3", "@babel/preset-react": "^7.27.1", "@babel/preset-typescript": "^7.27.1", - "@eslint/js": "^9.35.0", + "@eslint/js": "^9.36.0", "@testing-library/dom": "^10.4.1", - "@testing-library/jest-dom": "^6.8.0", + "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.0", "@types/clamp": "^1.0.3", "@types/common-tags": "^1.8.4", "@types/jest": "^30.0.0", "@types/minimist": "^1.2.5", - "@types/node": "^22.18.1", + "@types/node": "^22.18.10", "@types/query-string": "^6.3.0", - "@types/react": "^18.3.24", + "@types/react": "^18.3.26", "@types/react-dom": "^18.3.1", "@types/react-splitter-layout": "^4.0.0", "@types/react-transition-group": "^4.4.5", "@types/redux-logger": "^3.0.6", "@types/tgwf__co2": "^0.14.2", - "@typescript-eslint/eslint-plugin": "^8.41.0", - "@typescript-eslint/parser": "^8.41.0", + "@typescript-eslint/eslint-plugin": "^8.45.0", + "@typescript-eslint/parser": "^8.45.0", "alex": "^11.0.1", "autoprefixer": "^10.4.21", - "babel-jest": "^30.1.2", + "babel-jest": "^30.2.0", "babel-loader": "^10.0.0", "babel-plugin-module-resolver": "^5.0.2", - "browserslist": "^4.25.4", - "caniuse-lite": "^1.0.30001731", + "browserslist": "^4.26.3", + "caniuse-lite": "^1.0.30001743", "circular-dependency-plugin": "^5.2.1", "codecov": "^3.8.3", "copy-webpack-plugin": "^13.0.1", - "cross-env": "^10.0.0", + "cross-env": "^10.1.0", "css-loader": "^7.1.2", "cssnano": "^7.1.1", "devtools-license-check": "^0.9.0", - "eslint": "^9.35.0", + "eslint": "^9.36.0", "eslint-config-prettier": "^10.1.8", "eslint-import-resolver-alias": "^1.1.2", "eslint-plugin-import": "^2.32.0", @@ -160,11 +160,11 @@ "fetch-mock": "^12.5.4", "file-loader": "^6.2.0", "glob": "^11.0.3", - "globals": "^16.3.0", + "globals": "^16.4.0", "html-webpack-plugin": "^5.6.4", "husky": "^4.3.8", - "jest": "^30.1.3", - "jest-environment-jsdom": "^30.1.2", + "jest": "^30.2.0", + "jest-environment-jsdom": "^30.2.0", "jest-extended": "^6.0.0", "json-loader": "^0.5.7", "local-web-server": "^5.4.0", @@ -172,7 +172,7 @@ "mkdirp": "^3.0.1", "npm-run-all2": "^8.0.4", "open": "^10.2.0", - "patch-package": "^8.0.0", + "patch-package": "^8.0.1", "postcss": "^8.5.6", "postcss-loader": "^8.2.0", "postinstall-postinstall": "^2.1.0", @@ -180,18 +180,18 @@ "raw-loader": "^4.0.2", "rimraf": "^5.0.10", "style-loader": "^4.0.0", - "stylelint": "^16.23.1", + "stylelint": "^16.25.0", "stylelint-config-idiomatic-order": "^10.0.0", - "stylelint-config-standard": "^39.0.0", - "typescript": "^5.8.3", - "webpack": "^5.101.3", + "stylelint-config-standard": "^39.0.1", + "typescript": "^5.9.3", + "webpack": "^5.102.0", "webpack-cli": "^6.0.1", "webpack-dev-server": "^5.2.2", "workbox-webpack-plugin": "^7.3.0", "yargs": "^18.0.0" }, "resolutions": { - "@types/react-splitter-layout/@types/react": "^18.3.24", + "@types/react-splitter-layout/@types/react": "^18.3.26", "@types/trusted-types": "^2.0.7" }, "jest": { diff --git a/src/actions/code.ts b/src/actions/code.ts index 870d4590ce..aa235e2d1e 100644 --- a/src/actions/code.ts +++ b/src/actions/code.ts @@ -6,30 +6,34 @@ import type { SourceCodeLoadingError, ApiQueryError, DecodedInstruction, + IndexIntoSourceTable, } from 'firefox-profiler/types'; export function beginLoadingSourceCodeFromUrl( - file: string, + sourceIndex: IndexIntoSourceTable, url: string ): Action { - return { type: 'SOURCE_CODE_LOADING_BEGIN_URL', file, url }; + return { type: 'SOURCE_CODE_LOADING_BEGIN_URL', sourceIndex, url }; } export function beginLoadingSourceCodeFromBrowserConnection( - file: string + sourceIndex: IndexIntoSourceTable ): Action { - return { type: 'SOURCE_CODE_LOADING_BEGIN_BROWSER_CONNECTION', file }; + return { type: 'SOURCE_CODE_LOADING_BEGIN_BROWSER_CONNECTION', sourceIndex }; } -export function finishLoadingSourceCode(file: string, code: string): Action { - return { type: 'SOURCE_CODE_LOADING_SUCCESS', file, code }; +export function finishLoadingSourceCode( + sourceIndex: IndexIntoSourceTable, + code: string +): Action { + return { type: 'SOURCE_CODE_LOADING_SUCCESS', sourceIndex, code }; } export function failLoadingSourceCode( - file: string, + sourceIndex: IndexIntoSourceTable, errors: SourceCodeLoadingError[] ): Action { - return { type: 'SOURCE_CODE_LOADING_ERROR', file, errors }; + return { type: 'SOURCE_CODE_LOADING_ERROR', sourceIndex, errors }; } export function beginLoadingAssemblyCodeFromUrl( diff --git a/src/actions/profile-view.ts b/src/actions/profile-view.ts index 43af88bb8b..9ca988d8cc 100644 --- a/src/actions/profile-view.ts +++ b/src/actions/profile-view.ts @@ -1917,7 +1917,7 @@ export function changeTableViewOptions( export function updateBottomBoxContentsAndMaybeOpen( currentTab: TabSlug, - { libIndex, sourceFile, nativeSymbols }: BottomBoxInfo + { libIndex, sourceIndex, nativeSymbols }: BottomBoxInfo ): Action { // TODO: If the set has more than one element, pick the native symbol with // the highest total sample count @@ -1926,12 +1926,12 @@ export function updateBottomBoxContentsAndMaybeOpen( return { type: 'UPDATE_BOTTOM_BOX', libIndex, - sourceFile, + sourceIndex, nativeSymbol, allNativeSymbolsForInitiatingCallNode: nativeSymbols, currentTab, - shouldOpenBottomBox: sourceFile !== null || nativeSymbol !== null, - shouldOpenAssemblyView: sourceFile === null && nativeSymbol !== null, + shouldOpenBottomBox: sourceIndex !== null || nativeSymbol !== null, + shouldOpenAssemblyView: sourceIndex === null && nativeSymbol !== null, }; } diff --git a/src/actions/publish.ts b/src/actions/publish.ts index 9d86b6dd54..463e7b8ef9 100644 --- a/src/actions/publish.ts +++ b/src/actions/publish.ts @@ -9,9 +9,9 @@ import type { SanitizeProfileResult } from 'firefox-profiler/profile-logic/sanit import { getUploadGeneration, getSanitizedProfile, - getSanitizedProfileData, getRemoveProfileInformation, getPrePublishedState, + getSanitizedProfileEncodingState, } from 'firefox-profiler/selectors/publish'; import { getDataSource, @@ -36,14 +36,50 @@ import type { StartEndRange, ThreadIndex, State, + Profile, } from 'firefox-profiler/types'; +import { compress } from 'firefox-profiler/utils/gz'; +import { serializeProfile } from 'firefox-profiler/profile-logic/process-profile'; -export function toggleCheckedSharingOptions( - slug: keyof CheckedSharingOptions +export function updateSharingOption( + slug: keyof CheckedSharingOptions, + value: boolean ): Action { return { - type: 'TOGGLE_CHECKED_SHARING_OPTION', + type: 'UPDATE_SHARING_OPTION', slug, + value, + }; +} + +export function sanitizedProfileEncodingStarted( + sanitizedProfile: Profile +): Action { + return { + type: 'SANITIZED_PROFILE_ENCODING_STARTED', + sanitizedProfile, + }; +} + +export function sanitizedProfileEncodingCompleted( + sanitizedProfile: Profile, + profileData: Blob +): Action { + return { + type: 'SANITIZED_PROFILE_ENCODING_COMPLETED', + sanitizedProfile, + profileData, + }; +} + +export function sanitizedProfileEncodingFailed( + sanitizedProfile: Profile, + error: Error +): Action { + return { + type: 'SANITIZED_PROFILE_ENCODING_FAILED', + sanitizedProfile, + error, }; } @@ -196,6 +232,90 @@ async function persistJustUploadedProfileInformationToDb( } } +export type ProfileEncodingResult = + | { + type: 'SUCCESS'; + profileData: Blob; + } + | { type: 'ERROR'; error: Error }; + +function unwrapEncodedProfile(encodingResult: ProfileEncodingResult): Blob { + if (encodingResult.type === 'ERROR') { + throw encodingResult.error; + } + return encodingResult.profileData; +} + +export type InflightProfileEncoding = { + sanitizedProfile: Profile; + encodingPromise: Promise; +}; + +/** + * Kick off "encoding" of the sanitized profile. Specifically this means: + * - Compute the sanitized profile + * - Serialize the profile to a buffer + * - Kick off the asynchronous compression of the buffer + * + * The asynchronous compression can take a few seconds, so we want to kick + * it off immediately when the profile publishing panel is opened. We also + * want to be able to make use of the current in-flight compression if the + * user clicks the upload button before compression is done. This is why + * we return an `InflightProfileEncoding` object from this action; it contains + * a promise which lets other parts of the publishing pipeline wait on the + * compressed results. + * + * This thunk action is synchronous. + */ +export function encodeSanitizedProfile( + previousInflightEncoding?: InflightProfileEncoding +): ThunkAction { + return (dispatch, getState): InflightProfileEncoding => { + const state = getState(); + const sanitizedProfile = getSanitizedProfile(state).profile; + + if (previousInflightEncoding?.sanitizedProfile === sanitizedProfile) { + // No need to kick of another compression. The current encoding may still + // be in-flight, and returning the original promise allows the caller to + // await it. + return previousInflightEncoding; + } + + const encodingState = getSanitizedProfileEncodingState(state); + if ( + encodingState.phase === 'DONE' && + encodingState.sanitizedProfile === sanitizedProfile + ) { + // We already have an encoded version of this profile in our state! Use it. + return { + sanitizedProfile, + encodingPromise: Promise.resolve({ + type: 'SUCCESS', + profileData: encodingState.profileData, + }), + }; + } + + // Kick off a new encoding for this profile. Don't await the promise, + // just return it as part of the InflightProfileEncoding. + const encodingPromise: Promise = (async function () { + try { + dispatch(sanitizedProfileEncodingStarted(sanitizedProfile)); + const gzipData = await compress(serializeProfile(sanitizedProfile)); + const blob = new Blob([gzipData], { type: 'application/octet-binary' }); + dispatch(sanitizedProfileEncodingCompleted(sanitizedProfile, blob)); + return { type: 'SUCCESS', profileData: blob }; + } catch (error) { + dispatch(sanitizedProfileEncodingFailed(sanitizedProfile, error)); + console.error('Error while compressing the profile data', error); + return { type: 'ERROR', error }; + } + })(); + + return { sanitizedProfile, encodingPromise }; + }; +} + /** * This function starts the profile sharing process. Takes an optional argument that * indicates if the share attempt is being made for the second time. We have two share @@ -208,7 +328,9 @@ async function persistJustUploadedProfileInformationToDb( * The return value is used for tests to determine if the request went all the way * through (true) or was quit early due to the generation value being invalidated (false). */ -export function attemptToPublish(): ThunkAction> { +export function attemptToPublish( + previousInflightEncoding?: InflightProfileEncoding +): ThunkAction> { return async (dispatch, getState) => { try { sendAnalytics({ @@ -242,7 +364,10 @@ export function attemptToPublish(): ThunkAction> { dispatch(uploadCompressionStarted(abortfunction)); const sanitizedInformation = getSanitizedProfile(prePublishedState); - const gzipData = await getSanitizedProfileData(prePublishedState); + const profileEncoding = dispatch( + encodeSanitizedProfile(previousInflightEncoding) + ); + const encodingResult = await profileEncoding.encodingPromise; // The previous line was async, check to make sure that this request is still valid. // The upload could have been aborted while we were compressing the data. @@ -250,13 +375,18 @@ export function attemptToPublish(): ThunkAction> { return false; } + const encodedProfile = unwrapEncodedProfile(encodingResult); + dispatch(uploadStarted()); // Upload the profile, and notify it with the amount of data that has been // uploaded. - const hashOrToken = await startUpload(gzipData, (uploadProgress) => { - dispatch(updateUploadProgress(uploadProgress)); - }); + const hashOrToken = await startUpload( + encodedProfile, + (uploadProgress) => { + dispatch(updateUploadProgress(uploadProgress)); + } + ); const hash = extractProfileTokenFromJwt(hashOrToken); diff --git a/src/app-logic/browser-connection.ts b/src/app-logic/browser-connection.ts index 446d79b140..8a40db9c14 100644 --- a/src/app-logic/browser-connection.ts +++ b/src/app-logic/browser-connection.ts @@ -12,6 +12,7 @@ import { querySymbolicationApiViaWebChannel, getPageFaviconsViaWebChannel, showFunctionInDevtoolsViaWebChannel, + getJSSourcesViaWebChannel, } from './web-channel'; import type { Milliseconds, @@ -83,6 +84,8 @@ export interface BrowserConnection { line: number | null, column: number | null ): Promise; + + getJSSource(sourceUuid: string): Promise; } /** @@ -98,6 +101,7 @@ class BrowserConnectionImpl implements BrowserConnection { _webChannelSupportsGetExternalMarkers: boolean; _webChannelSupportsGetPageFavicons: boolean; _webChannelSupportsOpenDebuggerInTab: boolean; + _webChannelSupportsGetJSSource: boolean; _geckoProfiler: $GeckoProfiler | undefined; constructor(webChannelVersion: number) { @@ -106,6 +110,7 @@ class BrowserConnectionImpl implements BrowserConnection { this._webChannelSupportsGetExternalMarkers = webChannelVersion >= 3; this._webChannelSupportsGetPageFavicons = webChannelVersion >= 4; this._webChannelSupportsOpenDebuggerInTab = webChannelVersion >= 5; + this._webChannelSupportsGetJSSource = webChannelVersion >= 6; } // Only called when we must obtain the profile from the browser, i.e. if we @@ -226,6 +231,31 @@ class BrowserConnectionImpl implements BrowserConnection { return []; } + + /** + * Fetches JavaScript source code from the browser using the source UUID. + * This method requires WebChannel version 6 or higher (Firefox 145+). + */ + async getJSSource(sourceUuid: string): Promise { + if (!this._webChannelSupportsGetJSSource) { + throw new Error( + "Can't use getJSSource in Firefox versions with the old WebChannel." + ); + } + + // Even though the WebChannel request for fetching JS sources supports + // fetching multiple sources, we only fetch one at a time currently. + // TODO: Change this to fetch multiple JS sources at the load time or while + // we share the profile. + return getJSSourcesViaWebChannel([sourceUuid]).then((sources) => { + const source = sources[0]; + if ('error' in source) { + throw new Error(source.error); + } + + return source.sourceText; + }); + } } // Should work with: diff --git a/src/app-logic/constants.ts b/src/app-logic/constants.ts index 4ee3d1ad56..be047a25b2 100644 --- a/src/app-logic/constants.ts +++ b/src/app-logic/constants.ts @@ -7,12 +7,12 @@ import type { MarkerPhase } from 'firefox-profiler/types'; // The current version of the Gecko profile format. // Please don't forget to update the gecko profile format changelog in // `docs-developer/CHANGELOG-formats.md`. -export const GECKO_PROFILE_VERSION = 31; +export const GECKO_PROFILE_VERSION = 32; // The current version of the "processed" profile format. // Please don't forget to update the processed profile format changelog in // `docs-developer/CHANGELOG-formats.md`. -export const PROCESSED_PROFILE_VERSION = 57; +export const PROCESSED_PROFILE_VERSION = 58; // The following are the margin sizes for the left and right of the timeline. Independent // components need to share these values. diff --git a/src/app-logic/url-handling.ts b/src/app-logic/url-handling.ts index df7b8adbae..60267bbc77 100644 --- a/src/app-logic/url-handling.ts +++ b/src/app-logic/url-handling.ts @@ -47,8 +47,9 @@ import { encodeUintSetForUrlComponent, } from '../utils/uintarray-encoding'; import { tabSlugs } from '../app-logic/tabs-handling'; +import { StringTable } from 'firefox-profiler/utils/string-table'; -export const CURRENT_URL_VERSION = 11; +export const CURRENT_URL_VERSION = 12; /** * This static piece of state might look like an anti-pattern, but it's a relatively @@ -171,7 +172,7 @@ type BaseQuery = { view: string; implementation: string; timelineType: string; - sourceView: string; + sourceViewIndex: number; assemblyView: string; }; @@ -208,7 +209,7 @@ type Query = BaseQuery & { invertCallstack?: null | undefined; ctSummary?: string; transforms?: string; - sourceView?: string; + sourceViewIndex?: number; assemblyView?: string; // StackChart specific @@ -349,8 +350,8 @@ export function getQueryStringFromUrlState(urlState: UrlState): string { urlState.profileSpecific; if (isBottomBoxOpenPerPanel[selectedTab]) { - if (sourceView.sourceFile !== null) { - query.sourceView = sourceView.sourceFile; + if (sourceView.sourceIndex !== null) { + query.sourceViewIndex = sourceView.sourceIndex; } if (assemblyView.isOpen && assemblyView.nativeSymbol !== null) { query.assemblyView = stringifyAssemblyViewSymbol( @@ -508,7 +509,7 @@ export function stateFromLocation( const sourceView: SourceViewState = { scrollGeneration: 0, libIndex: null, - sourceFile: null, + sourceIndex: null, }; const assemblyView: AssemblyViewState = { isOpen: false, @@ -518,8 +519,8 @@ export function stateFromLocation( }; const isBottomBoxOpenPerPanel: any = {}; tabSlugs.forEach((tabSlug) => (isBottomBoxOpenPerPanel[tabSlug] = false)); - if (query.sourceView) { - sourceView.sourceFile = query.sourceView; + if (query.sourceViewIndex !== undefined) { + sourceView.sourceIndex = Number(query.sourceViewIndex); isBottomBoxOpenPerPanel[selectedTab] = true; } if (query.assemblyView) { @@ -1162,6 +1163,35 @@ const _upgraders: { processedLocation.query = {}; } }, + [12]: ( + processedLocation: ProcessedLocationBeforeUpgrade, + profile?: Profile + ) => { + // This version changes the source view parameter from 'sourceView' (filename + // string) to 'sourceViewIndex' (IndexIntoSourceTable). If we can't convert + // the filename to a source index, we just remove the sourceView parameter. + const { query } = processedLocation; + if (!('sourceView' in query) || !profile || !profile.shared.sources) { + return; + } + + // Try to find the source index for the given filename + const filename = query.sourceView; + const { sources, stringArray } = profile.shared; + const stringTable = StringTable.withBackingArray(stringArray); + + // Find the filename string index + const filenameStringIndex = stringTable.indexForString(filename); + if (filenameStringIndex !== -1) { + // Find the source index with this filename + const sourceIndex = sources.filename.indexOf(filenameStringIndex); + if (sourceIndex !== -1) { + query.sourceViewIndex = sourceIndex; + } + } + // Remove the old sourceView parameter regardless of whether we found a match + delete query.sourceView; + }, }; for (let destVersion = 1; destVersion <= CURRENT_URL_VERSION; destVersion++) { diff --git a/src/app-logic/web-channel.ts b/src/app-logic/web-channel.ts index 2dbe25fbf0..34ba5bdf8b 100644 --- a/src/app-logic/web-channel.ts +++ b/src/app-logic/web-channel.ts @@ -28,7 +28,8 @@ export type Request = | GetSymbolTableRequest | QuerySymbolicationApiRequest | GetPageFaviconsRequest - | OpenScriptInTabDebuggerRequest; + | OpenScriptInTabDebuggerRequest + | GetJSSourcesRequest; type StatusQueryRequest = { type: 'STATUS_QUERY' }; type EnableMenuButtonRequest = { type: 'ENABLE_MENU_BUTTON' }; @@ -64,6 +65,10 @@ type OpenScriptInTabDebuggerRequest = { line: number | null; column: number | null; }; +type GetJSSourcesRequest = { + type: 'GET_JS_SOURCES'; + sourceUuids: Array; +}; export type MessageFromBrowser = | OutOfBandErrorMessageFromBrowser @@ -128,6 +133,10 @@ type StatusQueryResponse = { // Shipped in Firefox 136. // Adds support for showing the JS script in DevTools debugger. // - OPEN_SCRIPT_IN_DEBUGGER + // Version 6: + // Shipped in Firefox 145. + // Adds support for fetching JS sources. + // - GET_JS_SOURCES version?: number; }; type EnableMenuButtonResponse = void; @@ -138,6 +147,8 @@ type GetSymbolTableResponse = SymbolTableAsTuple; type QuerySymbolicationApiResponse = string; type GetPageFaviconsResponse = Array; type OpenScriptInTabDebuggerResponse = void; +type GetJSSourceReponseItem = { sourceText: string } | { error: string }; +type GetJSSourcesResponse = Array; // TypeScript function overloads for request/response pairs. function _sendMessageWithResponse( @@ -167,6 +178,10 @@ function _sendMessageWithResponse( function _sendMessageWithResponse( request: OpenScriptInTabDebuggerRequest ): Promise; +function _sendMessageWithResponse( + request: GetJSSourcesRequest +): Promise; + function _sendMessageWithResponse(request: Request): Promise { const requestId = _requestId++; const type = request.type; @@ -371,6 +386,15 @@ export async function showFunctionInDevtoolsViaWebChannel( }); } +export async function getJSSourcesViaWebChannel( + sourceUuids: Array +): Promise> { + return _sendMessageWithResponse({ + type: 'GET_JS_SOURCES', + sourceUuids, + }); +} + /** * ----------------------------------------------------------------------------- * diff --git a/src/components/app/AppViewRouter.tsx b/src/components/app/AppViewRouter.tsx index fd7bec8fcd..fc04a205ff 100644 --- a/src/components/app/AppViewRouter.tsx +++ b/src/components/app/AppViewRouter.tsx @@ -98,6 +98,8 @@ class AppViewRouterImpl extends PureComponent { } } + const showBackHomeLink = dataSource === 'from-file'; + return ( { {`missing translation for ${message}`} ); diff --git a/src/components/app/BottomBox.tsx b/src/components/app/BottomBox.tsx index bfdae26482..4f5d8d2434 100644 --- a/src/components/app/BottomBox.tsx +++ b/src/components/app/BottomBox.tsx @@ -13,7 +13,6 @@ import { IonGraphView } from '../shared/IonGraphView'; import { CodeLoadingOverlay } from './CodeLoadingOverlay'; import { CodeErrorOverlay } from './CodeErrorOverlay'; import { - getSourceViewFile, getSourceViewScrollGeneration, getAssemblyViewIsOpen, getAssemblyViewNativeSymbol, @@ -29,7 +28,10 @@ import { getSourceViewCode, getAssemblyViewCode, } from 'firefox-profiler/selectors/code'; -import { getPreviewSelectionIsBeingModified } from 'firefox-profiler/selectors/profile'; +import { + getPreviewSelectionIsBeingModified, + getSourceViewFile, +} from 'firefox-profiler/selectors/profile'; import explicitConnect from 'firefox-profiler/utils/connect'; import type { ConnectedProps } from 'firefox-profiler/utils/connect'; diff --git a/src/components/app/CodeErrorOverlay.tsx b/src/components/app/CodeErrorOverlay.tsx index d3e113bd65..29d3dfa0d4 100644 --- a/src/components/app/CodeErrorOverlay.tsx +++ b/src/components/app/CodeErrorOverlay.tsx @@ -112,6 +112,17 @@ export function CodeErrorOverlay({ errors }: CodeErrorOverlayProps) { ); } + case 'NOT_PRESENT_IN_BROWSER': { + const { sourceUuid, url, errorMessage } = error; + return ( + +
  • {`The browser was unable to obtain the source file for ${url} with sourceUuid ${sourceUuid}: ${errorMessage}`}
  • +
    + ); + } default: throw assertExhaustiveCheck(error); } diff --git a/src/components/app/MenuButtons/Publish.css b/src/components/app/MenuButtons/Publish.css index 1e1a351c34..8df6094722 100644 --- a/src/components/app/MenuButtons/Publish.css +++ b/src/components/app/MenuButtons/Publish.css @@ -30,18 +30,18 @@ background-image: url(../../../../res/img/svg/error.svg); } -.menuButtonsPublishPanel { +.publishPanelPanel { --width: 510px; } -.menuButtonsPublishContent { +.publishPanelContent { position: relative; /* This aligns all content, except the big icon. */ padding-left: 70px; } -.menuButtonsPublishTitle { +.publishPanelTitle { /* "60px" This is the value to put the background image at the right location. * This background image is 44x44, so this puts it 16px left of the text. */ padding-left: 60px; @@ -50,32 +50,32 @@ line-height: 44px; /* This is the height of the background image */ } -.menuButtonsPublishInfoDescription { +.publishPanelInfoDescription { flex: 1; margin-bottom: 1em; line-height: 1.5; } -.menuButtonsPublishDataChoices { +.publishPanelDataChoices { margin-left: 10px; } -.menuButtonsPublishDataChoicesLabel { +.publishPanelDataChoicesLabel { display: flex; margin: 4px 0; } -.menuButtonsPublishDataChoicesIndicator { +.publishPanelDataChoicesIndicator { margin-left: 8px; } -.menuButtonsPublishButtons { +.publishPanelButtons { display: flex; justify-content: right; margin-top: 20px; } -.menuButtonsPublishButton { +.publishPanelButton { display: inline-flex; min-width: 132px; box-sizing: content-box; @@ -87,16 +87,16 @@ text-decoration: none; } -.menuButtonsPublishButtonDisabled { +.publishPanelButtonDisabled { opacity: 0.6; } -.menuButtonsPublishButtonDisabled:hover, -.menuButtonsPublishButtonDisabled:active:hover { +.publishPanelButtonDisabled:hover, +.publishPanelButtonDisabled:active:hover { background-color: var(--grey-90-a10); } -.menuButtonsPublishButtonsSvg { +.publishPanelButtonsSvg { position: relative; top: 4px; display: inline-block; @@ -104,13 +104,13 @@ margin-right: 5px; } -.menuButtonsPublishButtonsSvgUpload { +.publishPanelButtonsSvgUpload { width: 20px; height: 20px; background: url(../../../../res/img/svg/upload.svg) center center no-repeat; } -.menuButtonsPublishButtonsSvgDownload { +.publishPanelButtonsSvgDownload { width: 20px; height: 20px; background: url(../../../../res/img/svg/download.svg) center center no-repeat; @@ -122,28 +122,28 @@ font-size: 11px; } -.menuButtonsPublishUpload { +.publishPanelUpload { position: relative; padding: 10px 0; } -.menuButtonsPublishUploadTop { +.publishPanelUploadTop { margin: 10px; } -.menuButtonsPublishUploadPercentage { +.publishPanelUploadPercentage { margin: 10px 0; color: var(--blue-60); } -.menuButtonsPublishUploadBar { +.publishPanelUploadBar { overflow: hidden; height: 5px; border-radius: 2px; background-color: var(--grey-40); } -.menuButtonsPublishUploadBarInner { +.publishPanelUploadBarInner { position: absolute; top: 0; height: 3px; @@ -173,13 +173,13 @@ } } -.menuButtonsPublishError { +.publishPanelError { margin: 10px 0; } /* Do not animate the publish animation for stripes at the top loading bar. */ @media (prefers-reduced-motion) { - .menuButtonsPublishUploadBarInner { + .publishPanelUploadBarInner { animation: none; } } diff --git a/src/components/app/MenuButtons/Publish.tsx b/src/components/app/MenuButtons/Publish.tsx index 596419c087..b464465a33 100644 --- a/src/components/app/MenuButtons/Publish.tsx +++ b/src/components/app/MenuButtons/Publish.tsx @@ -4,10 +4,12 @@ import * as React from 'react'; import classNames from 'classnames'; +import type { InflightProfileEncoding } from 'firefox-profiler/actions/publish'; import { - toggleCheckedSharingOptions, + updateSharingOption, attemptToPublish, resetUploadState, + encodeSanitizedProfile, } from 'firefox-profiler/actions/publish'; import { getProfile, @@ -19,12 +21,12 @@ import { getAbortFunction, getCheckedSharingOptions, getFilenameString, - getSanitizedProfileData, getUploadPhase, getUploadProgress, getUploadProgressString, getUploadError, getShouldSanitizeByDefault, + getSanitizedProfileEncodingState, } from 'firefox-profiler/selectors/publish'; import { BlobUrlLink } from 'firefox-profiler/components/shared/BlobUrlLink'; import { assertExhaustiveCheck } from 'firefox-profiler/utils/types'; @@ -41,6 +43,7 @@ import type { CheckedSharingOptions, StartEndRange, UploadPhase, + SanitizedProfileEncodingState, } from 'firefox-profiler/types'; import './Publish.css'; @@ -56,7 +59,7 @@ type StateProps = { readonly shouldShowPreferenceOption: boolean; readonly profileContainsPrivateBrowsingInformation: boolean; readonly checkedSharingOptions: CheckedSharingOptions; - readonly sanitizedProfileDataPromise: Promise; + readonly sanitizedProfileEncodingState: SanitizedProfileEncodingState; readonly downloadFileName: string; readonly uploadPhase: UploadPhase; readonly uploadProgress: number; @@ -67,38 +70,28 @@ type StateProps = { }; type DispatchProps = { - readonly toggleCheckedSharingOptions: typeof toggleCheckedSharingOptions; + readonly updateSharingOption: typeof updateSharingOption; + readonly encodeSanitizedProfile: typeof encodeSanitizedProfile; readonly attemptToPublish: typeof attemptToPublish; readonly resetUploadState: typeof resetUploadState; }; type PublishProps = ConnectedProps; -type PublishState = { - compressError: Error | string | null; - prevCompressedPromise: Promise | null; -}; -class MenuButtonsPublishImpl extends React.PureComponent< - PublishProps, - PublishState -> { - override state = { compressError: null, prevCompressedPromise: null }; - _toggles: { [K in keyof CheckedSharingOptions]: () => void } = { - includeHiddenThreads: () => - this.props.toggleCheckedSharingOptions('includeHiddenThreads'), - includeAllTabs: () => - this.props.toggleCheckedSharingOptions('includeAllTabs'), - includeFullTimeRange: () => - this.props.toggleCheckedSharingOptions('includeFullTimeRange'), - includeScreenshots: () => - this.props.toggleCheckedSharingOptions('includeScreenshots'), - includeUrls: () => this.props.toggleCheckedSharingOptions('includeUrls'), - includeExtension: () => - this.props.toggleCheckedSharingOptions('includeExtension'), - includePreferenceValues: () => - this.props.toggleCheckedSharingOptions('includePreferenceValues'), - includePrivateBrowsingData: () => - this.props.toggleCheckedSharingOptions('includePrivateBrowsingData'), +class PublishPanelImpl extends React.PureComponent { + _inflightEncoding: InflightProfileEncoding | undefined; + + override componentDidMount(): void { + this._inflightEncoding = this.props.encodeSanitizedProfile(); + } + + _onCheckboxChange = (e: React.ChangeEvent) => { + const sharingOption = e.target.name as keyof CheckedSharingOptions; + this.props.updateSharingOption(sharingOption, e.target.checked); + + this._inflightEncoding = this.props.encodeSanitizedProfile( + this._inflightEncoding + ); }; _renderCheckbox( @@ -107,14 +100,13 @@ class MenuButtonsPublishImpl extends React.PureComponent< additionalContent?: React.ReactNode ) { const { checkedSharingOptions } = this.props; - const toggle = this._toggles[slug]; return ( -
    +
    -

    +

    {isRepublish ? ( Re-upload Performance Profile @@ -169,7 +146,7 @@ class MenuButtonsPublishImpl extends React.PureComponent< )}

    -

    +

    Upload your profile and make it accessible to anyone with the link. @@ -190,7 +167,7 @@ class MenuButtonsPublishImpl extends React.PureComponent< Include additional data that may be identifiable -

    +
    {this._renderCheckbox( 'includeHiddenThreads', 'MenuButtons--publish--renderCheckbox-label-hidden-threads' @@ -226,7 +203,7 @@ class MenuButtonsPublishImpl extends React.PureComponent< attrs={{ title: true }} > @@ -234,7 +211,7 @@ class MenuButtonsPublishImpl extends React.PureComponent< ) : null}
    - {this.state.compressError ? ( + {sanitizedProfileEncodingState.phase === 'ERROR' ? (
    @@ -244,18 +221,17 @@ class MenuButtonsPublishImpl extends React.PureComponent<
    ) : null} -
    +
    -
    {message}
    +
    {message}
    ); } @@ -375,7 +350,7 @@ class MenuButtonsPublishImpl extends React.PureComponent< } } -export const MenuButtonsPublish = explicitConnect< +export const PublishPanel = explicitConnect< OwnProps, StateProps, DispatchProps @@ -388,7 +363,7 @@ export const MenuButtonsPublish = explicitConnect< getContainsPrivateBrowsingInformation(state), checkedSharingOptions: getCheckedSharingOptions(state), downloadFileName: getFilenameString(state), - sanitizedProfileDataPromise: getSanitizedProfileData(state), + sanitizedProfileEncodingState: getSanitizedProfileEncodingState(state), uploadPhase: getUploadPhase(state), uploadProgress: getUploadProgress(state), uploadProgressString: getUploadProgressString(state), @@ -397,134 +372,67 @@ export const MenuButtonsPublish = explicitConnect< abortFunction: getAbortFunction(state), }), mapDispatchToProps: { - toggleCheckedSharingOptions, + updateSharingOption, + encodeSanitizedProfile, attemptToPublish, resetUploadState, }, - component: MenuButtonsPublishImpl, + component: PublishPanelImpl, }); type DownloadButtonProps = { - readonly sanitizedProfileDataPromise: Promise; + readonly sanitizedProfileEncodingState: SanitizedProfileEncodingState; readonly downloadFileName: string; - readonly onCompressError: (param: Error | string) => void; -}; - -type DownloadButtonState = { - sanitizedProfileData: Uint8Array | null; - prevPromise: Promise | null; - error: Error | string | null; }; /** * The DownloadButton handles unpacking the compressed profile promise. */ -class DownloadButton extends React.PureComponent< - DownloadButtonProps, - DownloadButtonState -> { - _isMounted: boolean = false; - override state = { - sanitizedProfileData: null, - prevPromise: null, - error: null, - }; - - static getDerivedStateFromProps( - props: DownloadButtonProps, - state: DownloadButtonState - ): Partial | null { - if (state.prevPromise !== props.sanitizedProfileDataPromise) { - return { - // Invalidate the old download size. - sanitizedProfileData: null, - prevPromise: props.sanitizedProfileDataPromise, - error: null, - }; - } - return null; - } - - _unwrapPromise() { - const { sanitizedProfileDataPromise } = this.props; - sanitizedProfileDataPromise.then( - (sanitizedProfileData) => { - if (this._isMounted) { - this.setState({ sanitizedProfileData, error: null }); - } - }, - (error) => { - if (this._isMounted) { - this.props.onCompressError(error); - console.error('Error while compressing the profile data', error); - this.setState({ sanitizedProfileData: null, error }); - } - } - ); - } - - override componentDidMount() { - this._isMounted = true; - this._unwrapPromise(); - } - - override componentDidUpdate(prevProps: DownloadButtonProps) { - if ( - prevProps.sanitizedProfileDataPromise !== - this.props.sanitizedProfileDataPromise - ) { - this._unwrapPromise(); - } - } - - override componentWillUnmount() { - this._isMounted = false; - } - +class DownloadButton extends React.PureComponent { override render() { - const { downloadFileName } = this.props; - const { sanitizedProfileData, error } = this.state; + const { sanitizedProfileEncodingState, downloadFileName } = this.props; const className = - 'photon-button menuButtonsPublishButton menuButtonsPublishButtonsDownload'; - - if (sanitizedProfileData) { - const blob = new Blob([sanitizedProfileData], { - type: 'application/octet-binary', - }); - return ( - - - Download{' '} - - ({prettyBytes(blob.size)}) - - - ); - } - - if (error) { - return ( - - ); + 'photon-button publishPanelButton publishPanelButtonsDownload'; + + switch (sanitizedProfileEncodingState.phase) { + case 'DONE': { + const { profileData } = sanitizedProfileEncodingState; + return ( + + + Download{' '} + + ({prettyBytes(profileData.size)}) + + + ); + } + case 'ERROR': { + return ( + + ); + } + case 'INITIAL': + case 'ENCODING': { + return ( + + ); + } + default: + throw assertExhaustiveCheck(sanitizedProfileEncodingState); } - - return ( - - ); } } diff --git a/src/components/app/MenuButtons/index.tsx b/src/components/app/MenuButtons/index.tsx index 062df5c36e..fc2d965154 100644 --- a/src/components/app/MenuButtons/index.tsx +++ b/src/components/app/MenuButtons/index.tsx @@ -25,7 +25,7 @@ import { * so that the CSS rules are in the correct order. */ import { ButtonWithPanel } from 'firefox-profiler/components/shared/ButtonWithPanel'; import { MetaInfoPanel } from './MetaInfo'; -import { MenuButtonsPublish } from './Publish'; +import { PublishPanel } from './Publish'; import { MenuButtonsPermalink } from './Permalink'; import { ProfileDeletePanel, @@ -285,10 +285,10 @@ class MenuButtonsImpl extends React.PureComponent { menuButtonsShareButtonError: isError, } )} - panelClassName="menuButtonsPublishPanel" + panelClassName="publishPanelPanel" // The value for the label following will be replaced label="" - panelContent={} + panelContent={} /> ); diff --git a/src/components/app/ProfileLoaderAnimation.tsx b/src/components/app/ProfileLoaderAnimation.tsx index 10566a487a..ad45dd4cfd 100644 --- a/src/components/app/ProfileLoaderAnimation.tsx +++ b/src/components/app/ProfileLoaderAnimation.tsx @@ -61,7 +61,8 @@ class ProfileLoaderAnimationImpl extends PureComponent { {isUploading ? (
    ) : null} diff --git a/src/components/app/SourceCodeFetcher.tsx b/src/components/app/SourceCodeFetcher.tsx index f0483b969e..0800b3f81d 100644 --- a/src/components/app/SourceCodeFetcher.tsx +++ b/src/components/app/SourceCodeFetcher.tsx @@ -8,8 +8,10 @@ import { getProfileOrNull, getSourceViewCode, getBrowserConnection, - getSourceViewFile, getSymbolServerUrl, + getSourceViewFile, + getSourceViewSourceIndex, + getSourceViewSourceUuid, } from 'firefox-profiler/selectors'; import { beginLoadingSourceCodeFromUrl, @@ -25,10 +27,16 @@ import { assertExhaustiveCheck } from 'firefox-profiler/utils/types'; import explicitConnect from 'firefox-profiler/utils/connect'; import type { ConnectedProps } from 'firefox-profiler/utils/connect'; -import type { SourceCodeStatus, Profile } from 'firefox-profiler/types'; +import type { + SourceCodeStatus, + Profile, + IndexIntoSourceTable, +} from 'firefox-profiler/types'; type StateProps = { readonly sourceViewFile: string | null; + readonly sourceViewSourceIndex: IndexIntoSourceTable | null; + readonly sourceViewSourceUuid: string | null; readonly sourceViewCode: SourceCodeStatus | void; readonly symbolServerUrl: string; readonly profile: Profile | null; @@ -55,15 +63,12 @@ class SourceCodeFetcherImpl extends React.PureComponent { this._triggerSourceLoadingIfNeeded(); } - _triggerSourceLoadingIfNeeded() { - const { sourceViewFile, sourceViewCode } = this.props; - if (sourceViewFile && !sourceViewCode) { - this._fetchSourceForFile(sourceViewFile); - } - } - - async _fetchSourceForFile(file: string) { + async _triggerSourceLoadingIfNeeded() { const { + sourceViewSourceIndex, + sourceViewCode, + sourceViewFile, + sourceViewSourceUuid, beginLoadingSourceCodeFromUrl, beginLoadingSourceCodeFromBrowserConnection, finishLoadingSourceCode, @@ -73,23 +78,34 @@ class SourceCodeFetcherImpl extends React.PureComponent { browserConnection, } = this.props; - const addressProof = - profile !== null ? findAddressProofForFile(profile, file) : null; + if (sourceViewSourceIndex === null || sourceViewCode || !sourceViewFile) { + return; + } + + if (!profile) { + return; + } + + const addressProof = findAddressProofForFile( + profile, + sourceViewSourceIndex + ); const delegate = new RegularExternalCommunicationDelegate( browserConnection, { onBeginUrlRequest: (url: string) => { - beginLoadingSourceCodeFromUrl(file, url); + beginLoadingSourceCodeFromUrl(sourceViewSourceIndex, url); }, onBeginBrowserConnectionQuery: () => { - beginLoadingSourceCodeFromBrowserConnection(file); + beginLoadingSourceCodeFromBrowserConnection(sourceViewSourceIndex); }, } ); const fetchSourceResult = await fetchSource( - file, + sourceViewFile, + sourceViewSourceUuid, symbolServerUrl, addressProof, this._archiveCache, @@ -98,10 +114,13 @@ class SourceCodeFetcherImpl extends React.PureComponent { switch (fetchSourceResult.type) { case 'SUCCESS': - finishLoadingSourceCode(file, fetchSourceResult.source); + finishLoadingSourceCode( + sourceViewSourceIndex, + fetchSourceResult.source + ); break; case 'ERROR': - failLoadingSourceCode(file, fetchSourceResult.errors); + failLoadingSourceCode(sourceViewSourceIndex, fetchSourceResult.errors); break; default: throw assertExhaustiveCheck(fetchSourceResult); @@ -116,7 +135,9 @@ class SourceCodeFetcherImpl extends React.PureComponent { export const SourceCodeFetcher = explicitConnect<{}, StateProps, DispatchProps>( { mapStateToProps: (state) => ({ + sourceViewSourceIndex: getSourceViewSourceIndex(state), sourceViewFile: getSourceViewFile(state), + sourceViewSourceUuid: getSourceViewSourceUuid(state), sourceViewCode: getSourceViewCode(state), symbolServerUrl: getSymbolServerUrl(state), profile: getProfileOrNull(state), diff --git a/src/components/calltree/CallTree.css b/src/components/calltree/CallTree.css index 1e4055fe98..73e7f3935c 100644 --- a/src/components/calltree/CallTree.css +++ b/src/components/calltree/CallTree.css @@ -31,6 +31,7 @@ } .treeBadge.inlined, -.treeBadge.divergent-inlining { +.treeBadge.divergent-inlining, +.backtraceBadge.inlined { background: url(../../../res/img/svg/inlined-icon.svg); } diff --git a/src/components/shared/Backtrace.tsx b/src/components/shared/Backtrace.tsx index 0bdc4bf884..7fce17be26 100644 --- a/src/components/shared/Backtrace.tsx +++ b/src/components/shared/Backtrace.tsx @@ -3,7 +3,9 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ import classNames from 'classnames'; +import { Localized } from '@fluent/react'; import { getBacktraceItemsForStack } from 'firefox-profiler/profile-logic/transforms'; +import { getFunctionName } from 'firefox-profiler/profile-logic/function-info'; import type { CategoryList, @@ -39,21 +41,34 @@ export function Backtrace(props: Props) { {funcNamesAndOrigins // Truncate the stacks .slice(0, maxStacks) - .map(({ funcName, origin, isFrameLabel, category }, i) => ( -
  • - - {funcName} - {origin} -
  • - ))} + .map( + ({ funcName, origin, isFrameLabel, category, inlineDepth }, i) => ( +
  • + + {inlineDepth > 0 ? ( + + + (inlined) + + + ) : null} + {funcName} + {origin} +
  • + ) + )} {funcNamesAndOrigins.length > maxStacks ? [ ; /** * This component is responsible for converting a Blob into an @@ -20,41 +16,20 @@ type State = { * does the proper thing of cleaning up after itself as the component * is mounted, updated, and unmounted. */ -export class BlobUrlLink extends React.PureComponent< - Props & React.AnchorHTMLAttributes, - State -> { - override state: State = { - url: '', - prevBlob: null, - }; - - static getDerivedStateFromProps(props: Props, state: State) { - if (props.blob === state.prevBlob) { - return null; - } - if (state.prevBlob) { - URL.revokeObjectURL(state.url); - } - return { - url: URL.createObjectURL(props.blob), - prevBlob: props.blob, - }; - } - - override componentWillUnmount() { - URL.revokeObjectURL(this.state.url); - } - - override render() { - const { blob, children, ...rest } = this.props; - - // This component must be an
    rather than a
    @@ -522,7 +549,11 @@ class MarkerTooltipContents extends React.PureComponent { } } -export const TooltipMarker = explicitConnect({ +export const TooltipMarker = explicitConnect< + OwnProps, + StateProps, + DispatchProps +>({ mapStateToProps: (state, props) => { const selectors = getThreadSelectorsFromThreadsKey(props.threadsKey); return { @@ -536,8 +567,10 @@ export const TooltipMarker = explicitConnect({ processIdToNameMap: getProcessIdToNameMap(state), markerSchemaByName: getMarkerSchemaByName(state), getMarkerLabel: selectors.getMarkerTooltipLabelGetter(state), + getMarkerSearchTerm: selectors.getMarkerSearchTermGetter(state), categories: getCategories(state), }; }, + mapDispatchToProps: { changeMarkersSearchString }, component: MarkerTooltipContents, }); diff --git a/src/components/tooltip/Tooltip.css b/src/components/tooltip/Tooltip.css index ae05fdc292..bd119676ca 100644 --- a/src/components/tooltip/Tooltip.css +++ b/src/components/tooltip/Tooltip.css @@ -33,11 +33,22 @@ } .tooltipTitle { + display: flex; overflow: hidden; + min-width: 0; flex: 1; + align-items: center; text-overflow: ellipsis; } +.tooltipTitleText { + overflow: hidden; + min-width: 0; + flex: 1; + text-overflow: ellipsis; + white-space: nowrap; +} + .tooltipSwatch { display: inline-block; width: 10px; diff --git a/src/profile-logic/call-tree.ts b/src/profile-logic/call-tree.ts index f1da6896e8..5802354430 100644 --- a/src/profile-logic/call-tree.ts +++ b/src/profile-logic/call-tree.ts @@ -605,7 +605,8 @@ export class CallTree { funcIndex, this._thread.funcTable, this._thread.resourceTable, - this._thread.stringTable + this._thread.stringTable, + this._thread.sources ); } diff --git a/src/profile-logic/data-structures.ts b/src/profile-logic/data-structures.ts index 5a83b94db3..dfb9994e8e 100644 --- a/src/profile-logic/data-structures.ts +++ b/src/profile-logic/data-structures.ts @@ -26,6 +26,7 @@ import type { CategoryList, JsTracerTable, CallNodeTable, + SourceTable, } from 'firefox-profiler/types'; /** @@ -160,7 +161,7 @@ export function getEmptyFuncTable(): FuncTable { relevantForJS: [], name: [], resource: [], - fileName: [], + source: [], lineNumber: [], columnNumber: [], length: 0, @@ -177,7 +178,7 @@ export function shallowCloneFuncTable(funcTable: FuncTable): FuncTable { relevantForJS: funcTable.relevantForJS.slice(), name: funcTable.name.slice(), resource: funcTable.resource.slice(), - fileName: funcTable.fileName.slice(), + source: funcTable.source.slice(), lineNumber: funcTable.lineNumber.slice(), columnNumber: funcTable.columnNumber.slice(), length: funcTable.length, @@ -370,6 +371,18 @@ export function getEmptyJsTracerTable(): JsTracerTable { }; } +export function getEmptySourceTable(): SourceTable { + return { + // Important! + // If modifying this structure, please update all callers of this function to ensure + // that they are pushing on correctly to the data structure. These pushes may not + // be caught by the type system. + uuid: [], + filename: [], + length: 0, + }; +} + export function getEmptyThread(overrides?: Partial): RawThread { const defaultThread: RawThread = { processType: 'default', @@ -427,6 +440,7 @@ export function getEmptyProfile(): Profile { pages: [], shared: { stringArray: [], + sources: getEmptySourceTable(), }, threads: [], }; diff --git a/src/profile-logic/gecko-profile-versioning.ts b/src/profile-logic/gecko-profile-versioning.ts index db1050fa02..d6987c52af 100644 --- a/src/profile-logic/gecko-profile-versioning.ts +++ b/src/profile-logic/gecko-profile-versioning.ts @@ -1488,6 +1488,16 @@ const _upgraders: { // marker data with the new field types data, and no modification is needed in the // frontend to display older formats. }, + [32]: (_) => { + // This version bump changes the frameTable location string to include + // optional sourceIndexes for the JS frames and adds optional source table + // to profile.sources. + // Older frontends will not be able to display these fields. + // No upgrade is needed: + // - There is no change to the JSON structure, the information is embedded + // within the existing location string. + // - The source ID is optional, so v31 profiles are valid v32 profiles. + }, // If you add a new upgrader here, please document the change in // `docs-developer/CHANGELOG-formats.md`. diff --git a/src/profile-logic/global-data-collector.ts b/src/profile-logic/global-data-collector.ts new file mode 100644 index 0000000000..8f9899529c --- /dev/null +++ b/src/profile-logic/global-data-collector.ts @@ -0,0 +1,104 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import { StringTable } from '../utils/string-table'; +import type { + Lib, + LibMapping, + IndexIntoLibs, + IndexIntoStringTable, + IndexIntoSourceTable, + RawProfileSharedData, + SourceTable, +} from 'firefox-profiler/types'; + +/** + * GlobalDataCollector collects data which is global in the processed profile + * format but per-process or per-thread in the Gecko profile format. It + * de-duplicates elements and builds one shared list of each type. + * For now it only de-duplicates libraries, but in the future we may move more + * tables to be global. + * You could also call this class an "interner". + */ +export class GlobalDataCollector { + _libs: Lib[] = []; + _libKeyToLibIndex: Map = new Map(); + _stringArray: string[] = []; + _stringTable: StringTable = StringTable.withBackingArray(this._stringArray); + _sources: SourceTable = { length: 0, uuid: [], filename: [] }; + _uuidToSourceIndex: Map = new Map(); + _filenameToSourceIndex: Map = + new Map(); + + // Return the global index for this library, adding it to the global list if + // necessary. + indexForLib(libMapping: LibMapping | Lib): IndexIntoLibs { + const { debugName, breakpadId } = libMapping; + const libKey = `${debugName}/${breakpadId}`; + let index = this._libKeyToLibIndex.get(libKey); + if (index === undefined) { + index = this._libs.length; + const { arch, name, path, debugPath, codeId } = libMapping; + this._libs.push({ + arch, + name, + path, + debugName, + debugPath, + breakpadId, + codeId: codeId ?? null, + }); + this._libKeyToLibIndex.set(libKey, index); + } + return index; + } + + // Return the global index for this source, adding it to the global list if + // necessary. + indexForSource(uuid: string | null, filename: string): IndexIntoSourceTable { + let index: IndexIntoSourceTable | undefined; + + if (uuid !== null) { + index = this._uuidToSourceIndex.get(uuid); + } else { + // For null UUIDs, use filename-based lookup + const filenameIndex = this._stringTable.indexForString(filename); + index = this._filenameToSourceIndex.get(filenameIndex); + } + + if (index === undefined) { + index = this._sources.length; + const filenameIndex = this._stringTable.indexForString(filename); + this._sources.uuid[index] = uuid; + this._sources.filename[index] = filenameIndex; + this._sources.length++; + + if (uuid !== null) { + this._uuidToSourceIndex.set(uuid, index); + } else { + this._filenameToSourceIndex.set(filenameIndex, index); + } + } + return index; + } + + getStringTable(): StringTable { + return this._stringTable; + } + + getSources(): SourceTable { + return this._sources; + } + + // Package up all de-duplicated global tables so that they can be embedded in + // the profile. + finish(): { libs: Lib[]; shared: RawProfileSharedData } { + const shared: RawProfileSharedData = { + stringArray: this._stringArray, + sources: this._sources, + }; + + return { libs: this._libs, shared }; + } +} diff --git a/src/profile-logic/import/chrome.ts b/src/profile-logic/import/chrome.ts index 8038af2abd..63d2f6c2c6 100644 --- a/src/profile-logic/import/chrome.ts +++ b/src/profile-logic/import/chrome.ts @@ -13,7 +13,7 @@ import type { } from 'firefox-profiler/types'; import { getEmptyProfile, getEmptyThread } from '../data-structures'; -import { StringTable } from '../../utils/string-table'; +import type { StringTable } from '../../utils/string-table'; import { ensureExists, coerce } from '../../utils/types'; import { INSTANT, @@ -23,6 +23,7 @@ import { } from 'firefox-profiler/app-logic/constants'; import { getOrCreateURIResource, getTimeRangeForThread } from '../profile-data'; +import { GlobalDataCollector } from '../global-data-collector'; // Chrome Tracing Event Spec: // https://docs.google.com/document/d/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU/preview @@ -501,7 +502,8 @@ async function processTracingEvents( // new samples on our target interval of 500us. profile.meta.interval = 0.5; - const stringTable = StringTable.withBackingArray(profile.shared.stringArray); + const globalDataCollector = new GlobalDataCollector(); + const stringTable = globalDataCollector.getStringTable(); let profileEvents: (ProfileEvent | CpuProfileEvent)[] = (eventsByName.get( 'Profile' @@ -639,8 +641,8 @@ async function processTracingEvents( ) : -1 ); - funcTable.fileName.push( - isJS ? stringTable.indexForString(url || '') : null + funcTable.source.push( + isJS && url ? globalDataCollector.indexForSource(null, url) : null ); funcTable.lineNumber.push( lineNumber === undefined ? null : lineNumber @@ -718,14 +720,16 @@ async function processTracingEvents( threadInfoByThread, eventsByName, profile, - (eventsByName.get('Screenshot') ?? []) as ScreenshotEvent[] + (eventsByName.get('Screenshot') ?? []) as ScreenshotEvent[], + stringTable ); extractMarkers( threadInfoByPidAndTid, threadInfoByThread, eventsByName, - profile + profile, + stringTable ); // Figure out the profiling start and end times if they haven't been found yet. @@ -800,6 +804,10 @@ async function processTracingEvents( return threadInfoA.tieBreakerIndex - threadInfoB.tieBreakerIndex; }); + // Add string array and sources from globalDataCollector to the profile + const { shared } = globalDataCollector.finish(); + profile.shared = shared; + return profile; } @@ -808,7 +816,8 @@ async function extractScreenshots( threadInfoByThread: Map, eventsByName: Map, profile: Profile, - screenshots: ScreenshotEvent[] + screenshots: ScreenshotEvent[], + stringTable: StringTable ): Promise { if (screenshots.length === 0) { // No screenshots were found, exit early. @@ -822,8 +831,6 @@ async function extractScreenshots( screenshots[0] ); - const stringTable = StringTable.withBackingArray(profile.shared.stringArray); - const graphicsIndex = ensureExists(profile.meta.categories).findIndex( (category) => category.name === 'Graphics' ); @@ -904,7 +911,8 @@ function extractMarkers( threadInfoByPidAndTid: Map, threadInfoByThread: Map, eventsByName: Map, - profile: Profile + profile: Profile, + stringTable: StringTable ) { const otherCategoryIndex = ensureExists(profile.meta.categories).findIndex( (category) => category.name === 'Other' @@ -913,8 +921,6 @@ function extractMarkers( throw new Error('No "Other" category in empty profile category list'); } - const stringTable = StringTable.withBackingArray(profile.shared.stringArray); - profile.meta.markerSchema = [ { name: 'EventDispatch', diff --git a/src/profile-logic/import/dhat.ts b/src/profile-logic/import/dhat.ts index 479d17bccf..ec07e36a0c 100644 --- a/src/profile-logic/import/dhat.ts +++ b/src/profile-logic/import/dhat.ts @@ -16,7 +16,7 @@ import { getEmptyUnbalancedNativeAllocationsTable, } from 'firefox-profiler/profile-logic/data-structures'; -import { StringTable } from 'firefox-profiler/utils/string-table'; +import { GlobalDataCollector } from 'firefox-profiler/profile-logic/global-data-collector'; import { ensureExists } from 'firefox-profiler/utils/types'; /** @@ -183,7 +183,8 @@ export function attemptToConvertDhat(json: unknown): Profile | null { const profile = getEmptyProfile(); profile.meta.product = dhat.cmd + ' (dhat)'; profile.meta.importedFrom = `dhat`; - const stringTable = StringTable.withBackingArray(profile.shared.stringArray); + const globalDataCollector = new GlobalDataCollector(); + const stringTable = globalDataCollector.getStringTable(); const allocationsTable = getEmptyUnbalancedNativeAllocationsTable(); const { funcTable, stackTable, frameTable } = getEmptyThread(); @@ -200,7 +201,7 @@ export function attemptToConvertDhat(json: unknown): Profile | null { funcTable.isJS.push(false); funcTable.relevantForJS.push(false); funcTable.resource.push(-1); - funcTable.fileName.push(null); + funcTable.source.push(null); funcTable.lineNumber.push(null); funcTable.columnNumber.push(null); const rootFuncIndex = funcTable.length++; @@ -269,7 +270,7 @@ export function attemptToConvertDhat(json: unknown): Profile | null { funcTable.isJS.push(false); funcTable.relevantForJS.push(false); funcTable.resource.push(-1); - funcTable.fileName.push(stringTable.indexForString(fileName)); + funcTable.source.push(globalDataCollector.indexForSource(null, fileName)); funcTable.lineNumber.push(line); funcTable.columnNumber.push(column); funcIndex = funcTable.length++; @@ -379,7 +380,7 @@ export function attemptToConvertDhat(json: unknown): Profile | null { thread.funcTable.isJS = funcTable.isJS.slice(); thread.funcTable.relevantForJS = funcTable.relevantForJS.slice(); thread.funcTable.resource = funcTable.resource.slice(); - thread.funcTable.fileName = funcTable.fileName.slice(); + thread.funcTable.source = funcTable.source.slice(); thread.funcTable.lineNumber = funcTable.lineNumber.slice(); thread.funcTable.columnNumber = funcTable.columnNumber.slice(); thread.funcTable.length = funcTable.length; @@ -408,5 +409,9 @@ export function attemptToConvertDhat(json: unknown): Profile | null { return thread; }); + // Get the final shared data from GlobalDataCollector + const { shared } = globalDataCollector.finish(); + profile.shared = shared; + return profile; } diff --git a/src/profile-logic/import/simpleperf.ts b/src/profile-logic/import/simpleperf.ts index cae0727740..52fe0a9831 100644 --- a/src/profile-logic/import/simpleperf.ts +++ b/src/profile-logic/import/simpleperf.ts @@ -27,6 +27,7 @@ import { getEmptySamplesTable, getEmptyRawMarkerTable, getEmptyNativeSymbolTable, + getEmptySourceTable, } from 'firefox-profiler/profile-logic/data-structures'; import { StringTable } from 'firefox-profiler/utils/string-table'; import { ensureExists } from 'firefox-profiler/utils/types'; @@ -129,7 +130,7 @@ class FirefoxFuncTable { this.funcTable.isJS.push(false); this.funcTable.relevantForJS.push(false); this.funcTable.resource.push(resourceIndex); - this.funcTable.fileName.push(null); + this.funcTable.source.push(null); this.funcTable.lineNumber.push(null); this.funcTable.columnNumber.push(null); @@ -370,6 +371,7 @@ class FirefoxProfile { libs: [], shared: { stringArray: this.stringArray, + sources: getEmptySourceTable(), }, threads: this.threads.map((thread) => thread.toJson()), }; diff --git a/src/profile-logic/js-tracer.tsx b/src/profile-logic/js-tracer.tsx index 6ab58a111b..2a18d95e13 100644 --- a/src/profile-logic/js-tracer.tsx +++ b/src/profile-logic/js-tracer.tsx @@ -20,6 +20,7 @@ import type { CategoryList, JsTracerTiming, Microseconds, + SourceTable, } from 'firefox-profiler/types'; // See the function below for more information. @@ -33,7 +34,8 @@ type ScriptLocationToFuncIndex = Map; */ function getScriptLocationToFuncIndex( thread: RawThread, - stringTable: StringTable + stringTable: StringTable, + sources: SourceTable ): ScriptLocationToFuncIndex { const { funcTable } = thread; const scriptLocationToFuncIndex = new Map(); @@ -43,9 +45,10 @@ function getScriptLocationToFuncIndex( } const line = funcTable.lineNumber[funcIndex]; const column = funcTable.columnNumber[funcIndex]; - const fileNameIndex = funcTable.fileName[funcIndex]; - if (column !== null && line !== null && fileNameIndex !== null) { - const fileName = stringTable.getString(fileNameIndex); + const sourceIndex = funcTable.source[funcIndex]; + if (column !== null && line !== null && sourceIndex !== null) { + const urlIndex = sources.filename[sourceIndex]; + const fileName = stringTable.getString(urlIndex); const key = `${fileName}:${line}:${column}`; if (scriptLocationToFuncIndex.has(key)) { // Multiple functions map to this script location. @@ -76,7 +79,8 @@ function getScriptLocationToFuncIndex( export function getJsTracerTiming( jsTracer: JsTracerTable, thread: RawThread, - stringTable: StringTable + stringTable: StringTable, + sources: SourceTable ): JsTracerTiming[] { const jsTracerTiming: JsTracerTiming[] = []; const { funcTable } = thread; @@ -86,7 +90,8 @@ export function getJsTracerTiming( // Just recompute it. const scriptLocationToFuncIndex = getScriptLocationToFuncIndex( thread, - stringTable + stringTable, + sources ); // Go through all of the events. @@ -496,7 +501,8 @@ export function convertJsTracerToThreadWithoutSamples( fromThread: RawThread, stringTable: StringTable, jsTracer: JsTracerFixed, - categories: CategoryList + categories: CategoryList, + sources: SourceTable ): { thread: RawThread; stackMap: Map; @@ -541,7 +547,8 @@ export function convertJsTracerToThreadWithoutSamples( } const scriptLocationToFuncIndex = getScriptLocationToFuncIndex( thread, - stringTable + stringTable, + sources ); // Go through all of the JS tracer events, and build up the func, stack, and @@ -579,7 +586,7 @@ export function convertJsTracerToThreadWithoutSamples( funcTable.isJS.push(false); funcTable.resource.push(-1); funcTable.relevantForJS.push(true); - funcTable.fileName.push(null); + funcTable.source.push(null); funcTable.lineNumber.push(null); funcTable.columnNumber.push(null); @@ -737,14 +744,16 @@ export function convertJsTracerToThread( fromThread: RawThread, jsTracer: JsTracerTable, categories: CategoryList, - stringTable: StringTable + stringTable: StringTable, + sources: SourceTable ): RawThread { const jsTracerFixed = getJsTracerFixed(jsTracer); const { thread, stackMap } = convertJsTracerToThreadWithoutSamples( fromThread, stringTable, jsTracerFixed, - categories + categories, + sources ); thread.samples = getSelfTimeSamplesFromJsTracer( stringTable, diff --git a/src/profile-logic/line-timings.ts b/src/profile-logic/line-timings.ts index 4b821ed0fd..b806654c24 100644 --- a/src/profile-logic/line-timings.ts +++ b/src/profile-logic/line-timings.ts @@ -8,10 +8,10 @@ import type { StackTable, SamplesLikeTable, IndexIntoCallNodeTable, - IndexIntoStringTable, StackLineInfo, LineTimings, LineNumber, + IndexIntoSourceTable, } from 'firefox-profiler/types'; import { getMatchingAncestorStackForInvertedCallNode } from './profile-data'; @@ -58,7 +58,7 @@ export function getStackLineInfo( stackTable: StackTable, frameTable: FrameTable, funcTable: FuncTable, - fileNameStringIndex: IndexIntoStringTable + sourceViewSourceIndex: IndexIntoSourceTable ): StackLineInfo { // "self line" == "the line which a stack's self time is contributed to" const selfLineForAllStacks = []; @@ -74,13 +74,13 @@ export function getStackLineInfo( const frame = stackTable.frame[stackIndex]; const prefixStack = stackTable.prefix[stackIndex]; const func = frameTable.func[frame]; - const fileNameStringIndexOfThisStack = funcTable.fileName[func]; + const sourceIndexOfThisStack = funcTable.source[func]; let selfLine: LineNumber | null = null; let totalLines: Set | null = prefixStack !== null ? totalLinesForAllStacks[prefixStack] : null; - if (fileNameStringIndexOfThisStack === fileNameStringIndex) { + if (sourceIndexOfThisStack === sourceViewSourceIndex) { selfLine = frameTable.line[frame]; if (selfLine !== null) { // Add this stack's line to this stack's totalLines. The rest of this stack's diff --git a/src/profile-logic/marker-schema.tsx b/src/profile-logic/marker-schema.tsx index ec392732b2..383f044283 100644 --- a/src/profile-logic/marker-schema.tsx +++ b/src/profile-logic/marker-schema.tsx @@ -20,6 +20,7 @@ import type { MarkerFormatType, MarkerSchema, MarkerSchemaByName, + MarkerSchemaField, Marker, MarkerIndex, MarkerPayload, @@ -366,6 +367,111 @@ export function getLabelGetter( }; } +/** + * Extract the value of the first field from a marker's tooltipLabel schema. + * This is used for filtering markers by their primary identifying value. + * Falls back to the marker name if no tooltipLabel is defined in the schema. + * + * This function should only be used behind a selector. + */ +export function getSearchTermGetter( + getMarker: (markerIndex: MarkerIndex) => Marker, + markerSchemaByName: MarkerSchemaByName, + stringTable: StringTable +): (markerIndex: MarkerIndex) => string { + // Cache the search terms as they are created. + const markerIndexToSearchTerm: Map = new Map(); + + return (markerIndex: MarkerIndex) => { + let searchTerm: string | undefined | null = + markerIndexToSearchTerm.get(markerIndex); + + if (searchTerm === undefined) { + const marker = getMarker(markerIndex); + const schemaName = marker.data ? marker.data.type : null; + + if (schemaName) { + const schema = markerSchemaByName[schemaName]; + if (schema?.tooltipLabel) { + // Extract the first field from the tooltipLabel + // e.g., "{marker.data.eventType} - DOMEvent" -> extract marker.data.eventType value + searchTerm = parseFirstField( + marker, + schema, + stringTable, + schema.tooltipLabel + ); + } + } + + // Fall back to the marker name if no schema, tooltipLabel, or extraction failed + if (!searchTerm) { + searchTerm = marker.name; + } + + // Cache this result. + markerIndexToSearchTerm.set(markerIndex, searchTerm); + } + + return searchTerm; + }; +} + +/** + * Parse the first field from a label string and extract its value from the marker. + * Returns null if no field is found or if the field is not a data field (marker.data.*). + * + * e.g., "{marker.data.eventType} - DOMEvent" extracts the value of marker.data.eventType + */ +function parseFirstField( + marker: Marker, + markerSchema: MarkerSchema, + stringTable: StringTable, + label: string +): string | null { + // Split the label on the "{key}" capture groups. + const splits = label.split(/{([^}]+)}/); + + if (splits.length < 2) { + // No fields in the label + return null; + } + + // The first field is at index 1 (even indices are literal strings) + const firstField = splits[1].trim(); + const keys = firstField.split('.'); + + // We only extract from marker.data.* fields (3 parts: marker, data, key) + if (keys.length !== 3) { + return null; + } + + const [markerStr, markerKey, payloadKey] = keys; + if (markerStr !== 'marker' || markerKey !== 'data' || !payloadKey) { + return null; + } + + // Access the payload data + const field = markerSchema.fields?.find( + (f: MarkerSchemaField) => f.key === payloadKey + ); + if (!field) { + return null; + } + + const payload = marker.data; + if (!payload) { + return null; + } + + const value = (payload as any)[payloadKey]; + if (value === undefined || value === null) { + return null; + } + + return formatFromMarkerSchema(payload.type, field.format, value, stringTable); +} + /** * This function formats a string from a marker type and a value. * If you wish to get markup instead, have a look at diff --git a/src/profile-logic/merge-compare.ts b/src/profile-logic/merge-compare.ts index 828c30a2df..be1bdaabdd 100644 --- a/src/profile-logic/merge-compare.ts +++ b/src/profile-logic/merge-compare.ts @@ -48,6 +48,7 @@ import type { IndexIntoStackTable, IndexIntoSamplesTable, IndexIntoStringTable, + IndexIntoSourceTable, FuncTable, FrameTable, Lib, @@ -55,6 +56,7 @@ import type { ResourceTable, RawSamplesTable, RawStackTable, + SourceTable, UrlState, ImplementationFilter, TransformStacksPerThread, @@ -144,6 +146,13 @@ export function mergeProfilesForDiffing( translationMaps: translationMapForStrings, } = mergeStringArrays(profiles.map((profile) => profile.shared.stringArray)); + // Then merge sources. + const { sources: newSources, translationMaps: translationMapForSources } = + mergeSources( + profiles.map((profile) => profile.shared.sources ?? null), + translationMapForStrings + ); + // Then merge libs. const { libs: newLibs, translationMaps: translationMapsForLibs } = mergeLibs( profiles.map((profile) => profile.libs) @@ -152,6 +161,7 @@ export function mergeProfilesForDiffing( resultProfile.shared = { stringArray: newStringArray, + sources: newSources, }; // Then we loop over all profiles and do the necessary changes according @@ -194,9 +204,9 @@ export function mergeProfilesForDiffing( thread.funcTable.name, translationMapForStrings[i] ), - fileName: adjustNullableStringIndexes( - thread.funcTable.fileName, - translationMapForStrings[i] + source: adjustNullableSourceIndexes( + thread.funcTable.source, + translationMapForSources[i] ), }; thread.resourceTable = { @@ -416,6 +426,7 @@ type TranslationMapForFrames = Map; type TranslationMapForStacks = Map; type TranslationMapForLibs = Map; type TranslationMapForStrings = Map; +type TranslationMapForSources = Map; type TranslationMapForSamples = Map< IndexIntoSamplesTable, IndexIntoSamplesTable @@ -481,6 +492,58 @@ function mergeStringArrays(stringArraysPerProfile: Array): { return { stringArray: newStringArray, translationMaps }; } +function mergeSources( + sourcesPerProfile: Array, + translationMapsForStrings: TranslationMapForStrings[] +): { + sources: SourceTable; + translationMaps: TranslationMapForSources[]; +} { + const newSources: SourceTable = { length: 0, uuid: [], filename: [] }; + const mapOfInsertedSources: Map = new Map(); + + const translationMaps = sourcesPerProfile.map((sources, profileIndex) => { + const translationMap = new Map(); + if (!sources) { + return translationMap; + } + + const stringTranslationMap = translationMapsForStrings[profileIndex]; + + for (let i = 0; i < sources.length; i++) { + const uuid = sources.uuid[i]; + const originalUrlIndex = sources.filename[i]; + const newUrlIndex = stringTranslationMap.get(originalUrlIndex); + + if (newUrlIndex === undefined) { + throw new Error( + `String index ${originalUrlIndex} not found in translation map` + ); + } + + const sourceKey = uuid ?? `null-uuid-${newUrlIndex}`; + let insertedSourceIndex = mapOfInsertedSources.get(sourceKey); + if (insertedSourceIndex === undefined) { + // Add new source + insertedSourceIndex = newSources.length; + newSources.uuid[insertedSourceIndex] = uuid; + newSources.filename[insertedSourceIndex] = newUrlIndex; + newSources.length++; + mapOfInsertedSources.set(sourceKey, insertedSourceIndex); + } + + translationMap.set(i, insertedSourceIndex); + } + + return translationMap; + }); + + return { + sources: newSources, + translationMaps, + }; +} + /** * Adjusts the category indices in a category list using a translation map. */ @@ -630,6 +693,27 @@ function adjustNullableStringIndexes( }); } +function adjustNullableSourceIndexes( + sourceIndexes: ReadonlyArray, + translationMap: TranslationMapForSources +): Array { + return sourceIndexes.map((sourceIndex) => { + if (sourceIndex === null) { + return null; + } + const newSourceIndex = translationMap.get(sourceIndex); + if (newSourceIndex === undefined) { + throw new Error( + stripIndent` + Source with index ${sourceIndex} hasn't been found in the translation map. + This shouldn't happen and indicates a bug in the profiler's code. + ` + ); + } + return newSourceIndex; + }); +} + /** * This combines the library lists from multiple profiles. It returns a merged * Lib array, along with a translation maps that can be used in other functions @@ -781,7 +865,7 @@ function combineFuncTables( const resourceTranslationMap = translationMapsForResources[threadIndex]; for (let i = 0; i < funcTable.length; i++) { - const fileNameIndex = funcTable.fileName[i]; + const sourceIndex = funcTable.source[i]; const resourceIndex = funcTable.resource[i]; const newResourceIndex = resourceIndex >= 0 @@ -817,7 +901,7 @@ function combineFuncTables( newFuncTable.name.push(nameIndex); newFuncTable.resource.push(newResourceIndex); newFuncTable.relevantForJS.push(funcTable.relevantForJS[i]); - newFuncTable.fileName.push(fileNameIndex); + newFuncTable.source.push(sourceIndex); newFuncTable.lineNumber.push(lineNumber); newFuncTable.columnNumber.push(funcTable.columnNumber[i]); diff --git a/src/profile-logic/process-profile.ts b/src/profile-logic/process-profile.ts index 63508ebab4..7a363ec58d 100644 --- a/src/profile-logic/process-profile.ts +++ b/src/profile-logic/process-profile.ts @@ -3,8 +3,8 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ import { attemptToConvertChromeProfile } from './import/chrome'; import { attemptToConvertDhat } from './import/dhat'; +import { GlobalDataCollector } from './global-data-collector'; import { AddressLocator } from './address-locator'; -import { StringTable } from '../utils/string-table'; import { resourceTypes, getEmptyExtensions, @@ -38,9 +38,9 @@ import { import { computeStringIndexMarkerFieldsByDataType } from '../profile-logic/marker-schema'; import { convertJsTracerToThread } from '../profile-logic/js-tracer'; +import type { StringTable } from '../utils/string-table'; import type { Profile, - RawProfileSharedData, RawThread, RawCounter, ExtensionTable, @@ -49,7 +49,6 @@ import type { RawSamplesTable, RawStackTable, RawMarkerTable, - Lib, LibMapping, FuncTable, ResourceTable, @@ -99,6 +98,7 @@ import type { MarkerPhase, Pid, GeckoMarkerSchema, + GeckoSourceTable, } from 'firefox-profiler/types'; import { decompress, isGzip } from 'firefox-profiler/utils/gz'; @@ -177,54 +177,6 @@ function _cleanFunctionName(functionName: string): string { return functionName; } -/** - * GlobalDataCollector collects data which is global in the processed profile - * format but per-process or per-thread in the Gecko profile format. It - * de-duplicates elements and builds one shared list of each type. - * For now it only de-duplicates libraries, but in the future we may move more - * tables to be global. - * You could also call this class an "interner". - */ -export class GlobalDataCollector { - _libs: Lib[] = []; - _libKeyToLibIndex: Map = new Map(); - _stringArray: string[] = []; - _stringTable: StringTable = StringTable.withBackingArray(this._stringArray); - - // Return the global index for this library, adding it to the global list if - // necessary. - indexForLib(libMapping: LibMapping | Lib): IndexIntoLibs { - const { debugName, breakpadId } = libMapping; - const libKey = `${debugName}/${breakpadId}`; - let index = this._libKeyToLibIndex.get(libKey); - if (index === undefined) { - index = this._libs.length; - const { arch, name, path, debugPath, codeId } = libMapping; - this._libs.push({ - arch, - name, - path, - debugName, - debugPath, - breakpadId, - codeId: codeId ?? null, - }); - this._libKeyToLibIndex.set(libKey, index); - } - return index; - } - - getStringTable(): StringTable { - return this._stringTable; - } - - // Package up all de-duplicated global tables so that they can be embedded in - // the profile. - finish(): { libs: Lib[]; shared: RawProfileSharedData } { - return { libs: this._libs, shared: { stringArray: this._stringArray } }; - } -} - type ExtractionInfo = { funcTable: FuncTable; resourceTable: ResourceTable; @@ -239,6 +191,7 @@ type ExtractionInfo = { { funcIndex: IndexIntoFuncTable; frameAddress: Address | null } >; globalDataCollector: GlobalDataCollector; + geckoSourceTable: GeckoSourceTable | undefined; }; /** @@ -255,7 +208,8 @@ export function extractFuncsAndResourcesFromFrameLocations( geckoThreadStringArray: string[], libs: LibMapping[], extensions: ExtensionTable = getEmptyExtensions(), - globalDataCollector: GlobalDataCollector + globalDataCollector: GlobalDataCollector, + geckoSourceTable: GeckoSourceTable | undefined ): { funcTable: FuncTable; resourceTable: ResourceTable; @@ -284,6 +238,7 @@ export function extractFuncsAndResourcesFromFrameLocations( libNameToResourceIndex: new Map(), stringToNewFuncIndexAndFrameAddress: new Map(), globalDataCollector, + geckoSourceTable, }; for (let i = 0; i < extensions.length; i++) { @@ -431,7 +386,7 @@ function _extractUnsymbolicatedFunction( funcTable.resource[funcIndex] = resourceIndex; funcTable.relevantForJS[funcIndex] = false; funcTable.isJS[funcIndex] = false; - funcTable.fileName[funcIndex] = null; + funcTable.source[funcIndex] = null; funcTable.lineNumber[funcIndex] = null; funcTable.columnNumber[funcIndex] = null; return { funcIndex, frameAddress: addressRelativeToLib }; @@ -494,7 +449,7 @@ function _extractCppFunction( funcTable.resource[newFuncIndex] = resourceIndex; funcTable.relevantForJS[newFuncIndex] = false; funcTable.isJS[newFuncIndex] = false; - funcTable.fileName[newFuncIndex] = null; + funcTable.source[newFuncIndex] = null; funcTable.lineNumber[newFuncIndex] = null; funcTable.columnNumber[newFuncIndex] = null; @@ -539,23 +494,32 @@ function _extractJsFunction( ): IndexIntoFuncTable | null { // Check for a JS location string. const jsMatch: RegExpResult = - // Given: "functionName (http://script.url/:1234:1234)" - // Captures: 1^^^^^^^^^^ 2^^^^^^^^^^^^^^^^^^ 3^^^ 4^^^ - /^(.*) \((.+?):([0-9]+)(?::([0-9]+))?\)$/.exec(locationString) || - // Given: "http://script.url/:1234:1234" - // Captures: 2^^^^^^^^^^^^^^^^^ 3^^^ 4^^^ - /^()(.+?):([0-9]+)(?::([0-9]+))?$/.exec(locationString); + // Given: "functionName (http://script.url/:1234:1234)" or "functionName (:1234:1234)[5]" + // Captures: 1^^^^^^^^^^ 2^^^^^^^^^^^^^^^^^^ 3^^^ 4^^^ 5^^^ + /^(.*) \((.+?):([0-9]+)(?::([0-9]+))?\)(?:\[(\d+)\])?$/.exec( + locationString + ) || + // Given: "http://script.url/:1234:1234" or "(:1234:1234)[5]" + // Captures: 2^^^^^^^^^^^^^^^^^ 3^^^ 4^^^ 5^^^ + /^()(.+?):([0-9]+)(?::([0-9]+))?(?:\[(\d+)\])?$/.exec(locationString); if (!jsMatch) { return null; } - const { funcTable, stringTable, resourceTable, originToResourceIndex } = - extractionInfo; + const { + funcTable, + stringTable, + resourceTable, + originToResourceIndex, + globalDataCollector, + geckoSourceTable, + } = extractionInfo; // Case 4: JS function - A match was found in the location string in the format // of a JS function. - const [, funcName, rawScriptURI] = jsMatch; + const [, funcName, rawScriptURI, lineNoStr, columnNoStr, sourceIndex] = + jsMatch; const scriptURI = _getRealScriptURI(rawScriptURI); const resourceIndex = getOrCreateURIResource( @@ -565,6 +529,25 @@ function _extractJsFunction( originToResourceIndex ); + // Process the source index if it's provided. + let processedSourceIndex = null; + if (sourceIndex !== undefined) { + const geckoSourceIdx = parseInt(sourceIndex, 10); + // Look up the UUID for this source index from the process's sources table + if (geckoSourceTable && geckoSourceIdx < geckoSourceTable.data.length) { + const uuidIndex = geckoSourceTable.schema.uuid; + const filenameIndex = geckoSourceTable.schema.filename; + const uuid = geckoSourceTable.data[geckoSourceIdx][uuidIndex]; + const filename = geckoSourceTable.data[geckoSourceIdx][filenameIndex]; + processedSourceIndex = globalDataCollector.indexForSource(uuid, filename); + } + } + + // If we don't have a source index from the sources table, create one using null uuid. + if (processedSourceIndex === null) { + processedSourceIndex = globalDataCollector.indexForSource(null, scriptURI); + } + let funcNameIndex; if (funcName) { funcNameIndex = stringTable.indexForString(funcName); @@ -575,9 +558,8 @@ function _extractJsFunction( // name. funcNameIndex = stringTable.indexForString(`(root scope) ${scriptURI}`); } - const fileName = stringTable.indexForString(scriptURI); - const lineNumber = parseInt(jsMatch[3], 10); - const columnNumber = jsMatch[4] ? parseInt(jsMatch[4], 10) : null; + const lineNumber = parseInt(lineNoStr, 10); + const columnNumber = columnNoStr ? parseInt(columnNoStr, 10) : null; // Add the function to the funcTable. const funcIndex = funcTable.length++; @@ -585,7 +567,7 @@ function _extractJsFunction( funcTable.resource[funcIndex] = resourceIndex; funcTable.relevantForJS[funcIndex] = false; funcTable.isJS[funcIndex] = true; - funcTable.fileName[funcIndex] = fileName; + funcTable.source[funcIndex] = processedSourceIndex; funcTable.lineNumber[funcIndex] = lineNumber; funcTable.columnNumber[funcIndex] = columnNumber; @@ -605,7 +587,7 @@ function _extractUnknownFunctionType( funcTable.resource[index] = -1; funcTable.relevantForJS[index] = relevantForJS; funcTable.isJS[index] = false; - funcTable.fileName[index] = null; + funcTable.source[index] = null; funcTable.lineNumber[index] = null; funcTable.columnNumber[index] = null; return index; @@ -1195,7 +1177,7 @@ function _processThread( _sortMarkers(thread.markers) ); - const { libs, pausedRanges, meta } = processProfile; + const { libs, pausedRanges, meta, sources } = processProfile; const { shutdownTime } = meta; const { funcTable, resourceTable, frameFuncs, frameAddresses } = @@ -1205,7 +1187,8 @@ function _processThread( thread.stringTable, libs, extensions, - globalDataCollector + globalDataCollector, + sources ); const nativeSymbols = getEmptyNativeSymbolTable(); const frameTable: FrameTable = _processFrameTable( @@ -1850,6 +1833,7 @@ export function processGeckoProfile(geckoProfile: GeckoProfile): Profile { const profileGatheringLog = { ...(geckoProfile.profileGatheringLog || {}) }; const stringTable = globalDataCollector.getStringTable(); + const sources = globalDataCollector.getSources(); // Convert JS tracer information into their own threads. This mutates // the threads array. @@ -1861,7 +1845,8 @@ export function processGeckoProfile(geckoProfile: GeckoProfile): Profile { thread, jsTracer, geckoProfile.meta.categories, - stringTable + stringTable, + sources ); jsTracerThread.isJsTracer = true; jsTracerThread.name = `JS Tracer of ${friendlyThreadName}`; diff --git a/src/profile-logic/processed-profile-versioning.ts b/src/profile-logic/processed-profile-versioning.ts index c1e833dd73..2448b486e7 100644 --- a/src/profile-logic/processed-profile-versioning.ts +++ b/src/profile-logic/processed-profile-versioning.ts @@ -2637,6 +2637,62 @@ const _upgraders: { } } }, + [58]: (profile) => { + // Add sources table to profile.shared.sources to gather all the sources. + // The function table's fileName field is replaced with a source field that + // references the sources table. + + // Create the sources table + const sourceTable = { + length: 0, + uuid: [] as Array, + filename: [] as Array, + }; + + // Map from fileName string index to source index + const fileNameIndexToSourceIndex = new Map(); + + // Process all threads to migrate fileName to source references + for (const thread of profile.threads) { + const { funcTable } = thread; + + // Create the new source column. + const funcTableSourceCol = new Array(funcTable.length); + + // Process each function + for (let funcIndex = 0; funcIndex < funcTable.length; funcIndex++) { + const fileNameIndex = funcTable.fileName[funcIndex]; + + if (fileNameIndex === null) { + funcTableSourceCol[funcIndex] = null; + } else { + // Check if we already have this fileNameIndex in the sources table + let sourceIndex = fileNameIndexToSourceIndex.get(fileNameIndex); + + if (sourceIndex === undefined) { + // Add new entry to sources table + sourceIndex = sourceTable.length; + sourceTable.uuid.push(null); + sourceTable.filename.push(fileNameIndex); + sourceTable.length++; + fileNameIndexToSourceIndex.set(fileNameIndex, sourceIndex); + } + + funcTableSourceCol[funcIndex] = sourceIndex; + } + } + + // Replace fileName field with source field + funcTable.source = funcTableSourceCol; + delete funcTable.fileName; + } + + // Add sources table to profile.shared + if (!profile.shared) { + profile.shared = {}; + } + profile.shared.sources = sourceTable; + }, // If you add a new upgrader here, please document the change in // `docs-developer/CHANGELOG-formats.md`. }; diff --git a/src/profile-logic/profile-compacting.ts b/src/profile-logic/profile-compacting.ts index 53377a07ad..49bd963c15 100644 --- a/src/profile-logic/profile-compacting.ts +++ b/src/profile-logic/profile-compacting.ts @@ -12,22 +12,25 @@ import type { FuncTable, ResourceTable, NativeSymbolTable, + SourceTable, } from 'firefox-profiler/types'; export type CompactedProfileWithTranslationMaps = { profile: Profile; oldStringToNewStringPlusOne: Int32Array; + oldSourceToNewSourcePlusOne: Int32Array; }; /** - * Returns a new profile with all unreferenced strings removed. + * Returns a new profile with all unreferenced strings and sources removed. * - * Since the string table is shared between all threads, if the user asks for a - * thread to be removed during sanitization, by default we'd keep the strings - * from the removed threads in the profile. + * Since the string table and source table are shared between all threads, if + * the user asks for a thread to be removed during sanitization, by default + * we'd keep the strings and sources from the removed threads in the profile. * - * By calling this function, you can get a profile with an adjusted string table - * where those unused strings from the removed threads have been removed. + * By calling this function, you can get a profile with adjusted string and + * source tables where those unused strings and sources from the removed + * threads have been removed. */ export function computeCompactedProfile( profile: Profile @@ -35,16 +38,20 @@ export function computeCompactedProfile( const stringIndexMarkerFieldsByDataType = computeStringIndexMarkerFieldsByDataType(profile.meta.markerSchema); - // Step 1: Gather all references. + // Step 1: Gather all references of strings. const referencedStrings = _gatherStringReferencesInProfile( profile, stringIndexMarkerFieldsByDataType ); - // Step 2: Adjust all tables to use new string indexes. - return _createProfileWithTranslatedStringIndexes( + // Step 2: Gather all references of sources. + const referencedSources = _gatherSourceReferencesInProfile(profile); + + // Step 3: Adjust all tables to use new string and source indexes. + return _createProfileWithTranslatedIndexes( profile, referencedStrings, + referencedSources, stringIndexMarkerFieldsByDataType ); } @@ -59,31 +66,64 @@ function _gatherStringReferencesInProfile( _gatherStringReferencesInThread( thread, referencedStrings, - stringIndexMarkerFieldsByDataType + stringIndexMarkerFieldsByDataType, + profile.shared.sources ?? null ); } return referencedStrings; } -function _createProfileWithTranslatedStringIndexes( +function _gatherSourceReferencesInProfile(profile: Profile): Uint8Array { + const referencedSources = new Uint8Array(profile.shared.sources.length); + + for (const thread of profile.threads) { + _gatherSourceReferencesInThread(thread, referencedSources); + } + + return referencedSources; +} + +function _gatherSourceReferencesInThread( + thread: RawThread, + referencedSources: Uint8Array +) { + for (let i = 0; i < thread.funcTable.length; i++) { + const sourceIndex = thread.funcTable.source[i]; + if (sourceIndex !== null) { + referencedSources[sourceIndex] = 1; + } + } +} + +function _createProfileWithTranslatedIndexes( profile: Profile, referencedStrings: Uint8Array, + referencedSources: Uint8Array, stringIndexMarkerFieldsByDataType: Map ): CompactedProfileWithTranslationMaps { const { newStringArray, oldStringToNewStringPlusOne } = _createCompactedStringArray(profile.shared.stringArray, referencedStrings); + const { newSources, oldSourceToNewSourcePlusOne } = + _createCompactedSourceTable( + profile.shared.sources, + referencedSources, + oldStringToNewStringPlusOne + ); + const newThreads = profile.threads.map((thread) => - _createThreadWithTranslatedStringIndexes( + _createThreadWithTranslatedIndexes( thread, oldStringToNewStringPlusOne, + oldSourceToNewSourcePlusOne, stringIndexMarkerFieldsByDataType ) ); const newShared: RawProfileSharedData = { stringArray: newStringArray, + sources: newSources, }; const newProfile: Profile = { @@ -95,13 +135,15 @@ function _createProfileWithTranslatedStringIndexes( return { profile: newProfile, oldStringToNewStringPlusOne, + oldSourceToNewSourcePlusOne, }; } function _gatherStringReferencesInThread( thread: RawThread, referencedStrings: Uint8Array, - stringIndexMarkerFieldsByDataType: Map + stringIndexMarkerFieldsByDataType: Map, + sources: SourceTable ) { _gatherReferencesInMarkers( thread.markers, @@ -109,14 +151,15 @@ function _gatherStringReferencesInThread( stringIndexMarkerFieldsByDataType ); - _gatherReferencesInFuncTable(thread.funcTable, referencedStrings); + _gatherReferencesInFuncTable(thread.funcTable, referencedStrings, sources); _gatherReferencesInResourceTable(thread.resourceTable, referencedStrings); _gatherReferencesInNativeSymbols(thread.nativeSymbols, referencedStrings); } -function _createThreadWithTranslatedStringIndexes( +function _createThreadWithTranslatedIndexes( thread: RawThread, oldStringToNewStringPlusOne: Int32Array, + oldSourceToNewSourcePlusOne: Int32Array, stringIndexMarkerFieldsByDataType: Map ): RawThread { const newNativeSymbols = _createNativeSymbolsWithTranslatedStringIndexes( @@ -127,9 +170,10 @@ function _createThreadWithTranslatedStringIndexes( thread.resourceTable, oldStringToNewStringPlusOne ); - const newFuncTable = _createFuncTableWithTranslatedStringIndexes( + const newFuncTable = _createFuncTableWithTranslatedIndexes( thread.funcTable, - oldStringToNewStringPlusOne + oldStringToNewStringPlusOne, + oldSourceToNewSourcePlusOne ); const newMarkers = _createMarkersWithTranslatedStringIndexes( thread.markers, @@ -221,37 +265,43 @@ function _createMarkersWithTranslatedStringIndexes( function _gatherReferencesInFuncTable( funcTable: FuncTable, - referencedStrings: Uint8Array + referencedStrings: Uint8Array, + sources: SourceTable ) { for (let i = 0; i < funcTable.length; i++) { referencedStrings[funcTable.name[i]] = 1; - const fileNameIndex = funcTable.fileName[i]; - if (fileNameIndex !== null) { - referencedStrings[fileNameIndex] = 1; + const sourceIndex = funcTable.source[i]; + if (sourceIndex !== null) { + const urlIndex = sources.filename[sourceIndex]; + referencedStrings[urlIndex] = 1; } } } -function _createFuncTableWithTranslatedStringIndexes( +function _createFuncTableWithTranslatedIndexes( funcTable: FuncTable, - oldStringToNewStringPlusOne: Int32Array + oldStringToNewStringPlusOne: Int32Array, + oldSourceToNewSourcePlusOne: Int32Array ): FuncTable { const newFuncTableNameCol = funcTable.name.slice(); - const newFuncTableFileNameCol = funcTable.fileName.slice(); + const newFuncTableSourceCol = funcTable.source.slice(); for (let i = 0; i < funcTable.length; i++) { const name = funcTable.name[i]; newFuncTableNameCol[i] = oldStringToNewStringPlusOne[name] - 1; - const fileName = funcTable.fileName[i]; - newFuncTableFileNameCol[i] = - fileName !== null ? oldStringToNewStringPlusOne[fileName] - 1 : null; + // Translate source indexes to new compacted source table. + const sourceIndex = funcTable.source[i]; + if (sourceIndex !== null) { + const newSourceIndexPlusOne = oldSourceToNewSourcePlusOne[sourceIndex]; + newFuncTableSourceCol[i] = newSourceIndexPlusOne - 1; + } } const newFuncTable = { ...funcTable, name: newFuncTableNameCol, - fileName: newFuncTableFileNameCol, + source: newFuncTableSourceCol, }; return newFuncTable; } @@ -338,3 +388,44 @@ function _createCompactedStringArray( return { newStringArray, oldStringToNewStringPlusOne }; } + +function _createCompactedSourceTable( + sourceTable: SourceTable, + referencedSources: Uint8Array, + oldStringToNewStringPlusOne: Int32Array +): { newSources: SourceTable; oldSourceToNewSourcePlusOne: Int32Array } { + const oldSourceToNewSourcePlusOne = new Int32Array(sourceTable.length); + let nextIndex = 0; + const newUuid = []; + const newFilename = []; + + for (let i = 0; i < sourceTable.length; i++) { + if (referencedSources[i] === 0) { + continue; + } + + const newIndex = nextIndex++; + newUuid[newIndex] = sourceTable.uuid[i]; + + // Translate the filename string index + const oldFilenameIndex = sourceTable.filename[i]; + const newFilenameIndexPlusOne = + oldStringToNewStringPlusOne[oldFilenameIndex]; + if (newFilenameIndexPlusOne === 0) { + throw new Error( + `String index ${oldFilenameIndex} was not found in the translation map` + ); + } + newFilename[newIndex] = newFilenameIndexPlusOne - 1; + + oldSourceToNewSourcePlusOne[i] = newIndex + 1; + } + + const newSources: SourceTable = { + length: nextIndex, + uuid: newUuid, + filename: newFilename, + }; + + return { newSources, oldSourceToNewSourcePlusOne }; +} diff --git a/src/profile-logic/profile-data.ts b/src/profile-logic/profile-data.ts index 76bff5aecf..7c9b4911ae 100644 --- a/src/profile-logic/profile-data.ts +++ b/src/profile-logic/profile-data.ts @@ -27,7 +27,6 @@ import { timeCode } from 'firefox-profiler/utils/time-code'; import { bisectionRight, bisectionLeft } from 'firefox-profiler/utils/bisect'; import { checkBit, makeBitSet, setBit } from 'firefox-profiler/utils/bitset'; import { parseFileNameFromSymbolication } from 'firefox-profiler/utils/special-paths'; -import { StringTable } from 'firefox-profiler/utils/string-table'; import { ensureExists, getFirstItemFromSet, @@ -39,6 +38,7 @@ import { import ExtensionFavicon from '../../res/img/svg/extension-outline.svg'; import DefaultLinkFavicon from '../../res/img/svg/globe.svg'; +import type { StringTable } from 'firefox-profiler/utils/string-table'; import type { Profile, RawProfileSharedData, @@ -95,6 +95,8 @@ import type { Bytes, ThreadWithReservedFunctions, TabID, + SourceTable, + IndexIntoSourceTable, } from 'firefox-profiler/types'; import type { CallNodeInfo, SuffixOrderIndex } from './call-node-info'; @@ -1489,7 +1491,11 @@ export function filterThreadToSearchStrings( return thread; } - return searchStrings.reduce(filterThreadToSearchString, thread); + return searchStrings.reduce( + (accThread, searchString) => + filterThreadToSearchString(accThread, searchString), + thread + ); }); } @@ -1501,8 +1507,14 @@ export function filterThreadToSearchString( return thread; } const lowercaseSearchString = searchString.toLowerCase(); - const { funcTable, frameTable, stackTable, stringTable, resourceTable } = - thread; + const { + funcTable, + frameTable, + stackTable, + stringTable, + resourceTable, + sources, + } = thread; function computeFuncMatchesSearch(func: IndexIntoFuncTable) { const nameIndex = funcTable.name[func]; @@ -1511,9 +1523,10 @@ export function filterThreadToSearchString( return true; } - const fileNameIndex = funcTable.fileName[func]; - if (fileNameIndex !== null) { - const fileNameString = stringTable.getString(fileNameIndex); + const sourceIndex = funcTable.source[func]; + if (sourceIndex !== null) { + const urlIndex = sources.filename[sourceIndex]; + const fileNameString = stringTable.getString(urlIndex); if (fileNameString.toLowerCase().includes(lowercaseSearchString)) { return true; } @@ -2315,7 +2328,8 @@ export function createThreadFromDerivedTables( rawThread: RawThread, samples: SamplesTable, stackTable: StackTable, - stringTable: StringTable + stringTable: StringTable, + sources: SourceTable ): Thread { const { processType, @@ -2375,6 +2389,7 @@ export function createThreadFromDerivedTables( samples, stackTable, stringTable, + sources, }; return thread; } @@ -2831,6 +2846,7 @@ export function getOriginAnnotationForFunc( funcTable: FuncTable, resourceTable: ResourceTable, stringTable: StringTable, + sources: SourceTable, frameLineNumber: number | null = null, frameColumnNumber: number | null = null ): string { @@ -2843,11 +2859,14 @@ export function getOriginAnnotationForFunc( origin = stringTable.getString(resourceNameIndex); } - const fileNameIndex = funcTable.fileName[funcIndex]; + const sourceIndex = funcTable.source[funcIndex]; let fileName; - if (fileNameIndex !== null) { - fileName = stringTable.getString(fileNameIndex); + if (sourceIndex !== null) { + const urlIndex = sources.filename[sourceIndex]; + fileName = stringTable.getString(urlIndex); + } + if (fileName) { // Strip off any filename decorations from symbolication. It could be a path // (potentially using "special path" syntax, e.g. hg:...), or it could be a // URL, if the function is a JS function. If it's a path from symbolication, @@ -2917,13 +2936,12 @@ export function reserveFunctionsInThread( const resourceType = resourceTable.type[resourceIndex]; const name = resourceTable.name[resourceIndex]; const isJS = jsResourceTypes.includes(resourceType); - const fileName = resourceType === resourceTypes.url ? name : null; const funcIndex = funcTable.length; funcTable.isJS.push(isJS); funcTable.relevantForJS.push(isJS); funcTable.name.push(name); funcTable.resource.push(resourceIndex); - funcTable.fileName.push(fileName); + funcTable.source.push(null); funcTable.lineNumber.push(null); funcTable.columnNumber.push(null); funcTable.length++; @@ -3761,15 +3779,12 @@ export function nudgeReturnAddresses(thread: RawThread): RawThread { */ export function findAddressProofForFile( profile: Profile, - file: string + sourceIndex: IndexIntoSourceTable ): AddressProof | null { const { libs } = profile; - const { stringArray } = profile.shared; - const stringTable = StringTable.withBackingArray(stringArray); for (const thread of profile.threads) { const { frameTable, funcTable, resourceTable } = thread; - const fileStringIndex = stringTable.indexForString(file); - const func = funcTable.fileName.indexOf(fileStringIndex); + const func = funcTable.source.indexOf(sourceIndex); if (func === -1) { continue; } @@ -3961,8 +3976,7 @@ export function getBottomBoxInfoForCallNode( } = thread; const funcIndex = callNodeInfo.funcForNode(callNodeIndex); - const fileName = funcTable.fileName[funcIndex]; - const sourceFile = fileName !== null ? stringTable.getString(fileName) : null; + const sourceIndex = funcTable.source[funcIndex]; const resource = funcTable.resource[funcIndex]; const libIndex = resource !== -1 && resourceTable.type[resource] === resourceTypes.library @@ -3986,7 +4000,7 @@ export function getBottomBoxInfoForCallNode( return { libIndex, - sourceFile, + sourceIndex, nativeSymbols: nativeSymbolInfosForCallNode, }; } diff --git a/src/profile-logic/profile-store.ts b/src/profile-logic/profile-store.ts index 3ad95443c0..ec299335b6 100644 --- a/src/profile-logic/profile-store.ts +++ b/src/profile-logic/profile-store.ts @@ -29,7 +29,7 @@ export function uploadBinaryProfileData() { xhr.abort(); }, startUpload: ( - data: ArrayBufferView, + data: ArrayBufferView | Blob, progressChangeCallback?: (param: number) => unknown ): Promise => new Promise((resolve, reject) => { diff --git a/src/profile-logic/sanitize.ts b/src/profile-logic/sanitize.ts index 2ff0f19fb5..e9eefdd8f7 100644 --- a/src/profile-logic/sanitize.ts +++ b/src/profile-logic/sanitize.ts @@ -129,6 +129,7 @@ export function sanitizePII( pages: pages, shared: { stringArray, + sources: profile.shared.sources, }, threads: profile.threads.reduce((acc, thread, threadIndex) => { const newThread: RawThread | null = sanitizeThreadPII( @@ -480,7 +481,7 @@ function sanitizeThreadPII( newFuncTable.isJS.push(funcTable.isJS[funcIndex]); newFuncTable.relevantForJS.push(funcTable.isJS[funcIndex]); newFuncTable.resource.push(-1); - newFuncTable.fileName.push(null); + newFuncTable.source.push(null); newFuncTable.lineNumber.push(null); newFuncTable.columnNumber.push(null); newFuncTable.length++; @@ -495,7 +496,7 @@ function sanitizeThreadPII( const name = stringTable.indexForString(``); newFuncTable.name[funcIndex] = name; - newFuncTable.fileName[funcIndex] = null; + newFuncTable.source[funcIndex] = null; if (newFuncTable.resource[funcIndex] >= 0) { resourcesToBeSanitized.add(newFuncTable.resource[funcIndex]); } diff --git a/src/profile-logic/symbolication.ts b/src/profile-logic/symbolication.ts index 830cfab668..e812602ec7 100644 --- a/src/profile-logic/symbolication.ts +++ b/src/profile-logic/symbolication.ts @@ -538,7 +538,7 @@ function _partiallyApplySymbolicationStep( IndexIntoFrameTable[] > ): RawThread { - const { stringArray } = shared; + const { stringArray, sources } = shared; const { frameTable: oldFrameTable, funcTable: oldFuncTable, @@ -731,7 +731,11 @@ function _partiallyApplySymbolicationStep( let addressResult = resultsForLib.get(address); if (addressResult === undefined) { const symbolName = nativeSymbols.name[nativeSymbolIndex]; - const fileNameIndex = funcTable.fileName[oldFunc]; + let fileNameIndex = null; + const sourceIndex = funcTable.source[oldFunc]; + if (sourceIndex !== null) { + fileNameIndex = sources.filename[sourceIndex]; + } addressResult = { symbolAddress: nativeSymbols.address[nativeSymbolIndex], name: stringTable.getString(symbolName), @@ -778,14 +782,36 @@ function _partiallyApplySymbolicationStep( funcTable.isJS[funcIndex] = false; funcTable.relevantForJS[funcIndex] = false; funcTable.resource[funcIndex] = resourceIndex; - funcTable.fileName[funcIndex] = null; + funcTable.source[funcIndex] = null; funcTable.lineNumber[funcIndex] = null; funcTable.columnNumber[funcIndex] = null; // The name field will be filled below. funcTable.length++; } funcTable.name[funcIndex] = functionStringIndex; - funcTable.fileName[funcIndex] = fileNameStringIndex; + // Store filename in sources table if we have one + if (fileNameStringIndex !== null) { + // Find or create source entry + let sourceIndex = null; + for (let i = 0; i < sources.filename.length; i++) { + if ( + sources.filename[i] === fileNameStringIndex && + sources.uuid[i] === null + ) { + sourceIndex = i; + break; + } + } + if (sourceIndex === null) { + sourceIndex = sources.filename.length; + sources.filename.push(fileNameStringIndex); + sources.uuid.push(null); + sources.length++; + } + funcTable.source[funcIndex] = sourceIndex; + } else { + funcTable.source[funcIndex] = null; + } funcKeyToFuncMap.set(funcKey, funcIndex); } inlineExpansionFuncIndexes.push(funcIndex); diff --git a/src/profile-logic/transforms.ts b/src/profile-logic/transforms.ts index 84ab9c68e0..0e52d6429b 100644 --- a/src/profile-logic/transforms.ts +++ b/src/profile-logic/transforms.ts @@ -1589,6 +1589,8 @@ export type BacktraceItem = { // library instead. // May also be empty. origin: string; + // The inline depth of this frame. Frames with inline depth > 0 are inlined. + inlineDepth: number; }; /** @@ -1601,7 +1603,7 @@ export function getBacktraceItemsForStack( implementationFilter: ImplementationFilter, thread: Thread ): BacktraceItem[] { - const { funcTable, stringTable, resourceTable } = thread; + const { funcTable, stringTable, resourceTable, sources } = thread; const { stackTable, frameTable } = thread; const unfilteredPath = []; @@ -1616,6 +1618,7 @@ export function getBacktraceItemsForStack( funcIndex: frameTable.func[frameIndex], frameLine: frameTable.line[frameIndex], frameColumn: frameTable.column[frameIndex], + inlineDepth: frameTable.inlineDepth[frameIndex], }); } @@ -1623,21 +1626,25 @@ export function getBacktraceItemsForStack( const path = unfilteredPath.filter(({ funcIndex }) => funcMatchesImplementation(thread, funcIndex) ); - return path.map(({ category, funcIndex, frameLine, frameColumn }) => { - return { - funcName: stringTable.getString(funcTable.name[funcIndex]), - category: category, - isFrameLabel: funcTable.resource[funcIndex] === -1, - origin: getOriginAnnotationForFunc( - funcIndex, - funcTable, - resourceTable, - stringTable, - frameLine, - frameColumn - ), - }; - }); + return path.map( + ({ category, funcIndex, frameLine, frameColumn, inlineDepth }) => { + return { + funcName: stringTable.getString(funcTable.name[funcIndex]), + category, + isFrameLabel: funcTable.resource[funcIndex] === -1, + origin: getOriginAnnotationForFunc( + funcIndex, + funcTable, + resourceTable, + stringTable, + sources, + frameLine, + frameColumn + ), + inlineDepth, + }; + } + ); } /** diff --git a/src/reducers/code.ts b/src/reducers/code.ts index d9f8054800..3a6e863e07 100644 --- a/src/reducers/code.ts +++ b/src/reducers/code.ts @@ -7,39 +7,43 @@ import type { SourceCodeStatus, AssemblyCodeStatus, CodeState, + IndexIntoSourceTable, } from 'firefox-profiler/types'; import { combineReducers } from 'redux'; -const sourceCodeCache: Reducer> = ( +const sourceCodeCache: Reducer> = ( state = new Map(), action ) => { switch (action.type) { case 'SOURCE_CODE_LOADING_BEGIN_URL': { - const { file, url } = action; + const { sourceIndex, url } = action; const newState = new Map(state); - newState.set(file, { type: 'LOADING', source: { type: 'URL', url } }); + newState.set(sourceIndex, { + type: 'LOADING', + source: { type: 'URL', url }, + }); return newState; } case 'SOURCE_CODE_LOADING_BEGIN_BROWSER_CONNECTION': { - const { file } = action; + const { sourceIndex } = action; const newState = new Map(state); - newState.set(file, { + newState.set(sourceIndex, { type: 'LOADING', source: { type: 'BROWSER_CONNECTION' }, }); return newState; } case 'SOURCE_CODE_LOADING_SUCCESS': { - const { file, code } = action; + const { sourceIndex, code } = action; const newState = new Map(state); - newState.set(file, { type: 'AVAILABLE', code }); + newState.set(sourceIndex, { type: 'AVAILABLE', code }); return newState; } case 'SOURCE_CODE_LOADING_ERROR': { - const { file, errors } = action; + const { sourceIndex, errors } = action; const newState = new Map(state); - newState.set(file, { type: 'ERROR', errors }); + newState.set(sourceIndex, { type: 'ERROR', errors }); return newState; } default: diff --git a/src/reducers/publish.ts b/src/reducers/publish.ts index 25dd14b25f..d3c515ce9e 100644 --- a/src/reducers/publish.ts +++ b/src/reducers/publish.ts @@ -12,6 +12,7 @@ import type { UploadPhase, Reducer, State, + SanitizedProfileEncodingState, } from 'firefox-profiler/types'; function _getSanitizingSharingOptions(): CheckedSharingOptions { @@ -52,10 +53,10 @@ const checkedSharingOptions: Reducer = ( : _getMostlyNonSanitizingSharingOptions(); return newState; } - case 'TOGGLE_CHECKED_SHARING_OPTION': + case 'UPDATE_SHARING_OPTION': return { ...state, - [action.slug]: !state[action.slug], + [action.slug]: action.value, }; default: return state; @@ -212,8 +213,43 @@ const hasSanitizedProfile: Reducer = (state = false, action) => { } }; +const sanitizedProfileEncodingState: Reducer = ( + state = { phase: 'INITIAL' }, + action +): SanitizedProfileEncodingState => { + switch (action.type) { + case 'SANITIZED_PROFILE_ENCODING_STARTED': { + const { sanitizedProfile } = action; + return { phase: 'ENCODING', sanitizedProfile }; + } + case 'SANITIZED_PROFILE_ENCODING_COMPLETED': { + const { sanitizedProfile, profileData } = action; + if ( + state.phase === 'ENCODING' && + state.sanitizedProfile === sanitizedProfile + ) { + return { phase: 'DONE', sanitizedProfile, profileData }; + } + return state; // Ignore updates from earlier encodings. + } + case 'SANITIZED_PROFILE_ENCODING_FAILED': { + const { sanitizedProfile, error } = action; + if ( + state.phase === 'ENCODING' && + state.sanitizedProfile === sanitizedProfile + ) { + return { phase: 'ERROR', sanitizedProfile, error }; + } + return state; // Ignore updates from earlier encodings. + } + default: + return state; + } +}; + const publishReducer: Reducer = combineReducers({ checkedSharingOptions, + sanitizedProfileEncodingState, upload, isHidingStaleProfile, hasSanitizedProfile, diff --git a/src/reducers/url-state.ts b/src/reducers/url-state.ts index 8f107727ca..9469e9a90e 100644 --- a/src/reducers/url-state.ts +++ b/src/reducers/url-state.ts @@ -561,7 +561,7 @@ const profileName: Reducer = (state = null, action) => { }; const sourceView: Reducer = ( - state = { scrollGeneration: 0, libIndex: null, sourceFile: null }, + state = { scrollGeneration: 0, libIndex: null, sourceIndex: null }, action ) => { switch (action.type) { @@ -569,7 +569,7 @@ const sourceView: Reducer = ( return { scrollGeneration: state.scrollGeneration + 1, libIndex: action.libIndex, - sourceFile: action.sourceFile, + sourceIndex: action.sourceIndex, }; } default: diff --git a/src/selectors/code.tsx b/src/selectors/code.tsx index 3a91c75223..210d102046 100644 --- a/src/selectors/code.tsx +++ b/src/selectors/code.tsx @@ -7,19 +7,24 @@ import type { Lib, SourceCodeStatus, Selector, + IndexIntoSourceTable, } from 'firefox-profiler/types'; -import { getSourceViewFile, getAssemblyViewNativeSymbol } from './url-state'; +import { + getSourceViewSourceIndex, + getAssemblyViewNativeSymbol, +} from './url-state'; import { getProfileOrNull } from './profile'; -export const getSourceCodeCache: Selector> = ( - state -) => state.code.sourceCodeCache; +export const getSourceCodeCache: Selector< + Map +> = (state) => state.code.sourceCodeCache; export const getSourceViewCode: Selector = createSelector( getSourceCodeCache, - getSourceViewFile, - (sourceCodeCache, file) => (file ? sourceCodeCache.get(file) : undefined) + getSourceViewSourceIndex, + (sourceCodeCache, sourceIndex) => + sourceIndex !== null ? sourceCodeCache.get(sourceIndex) : undefined ); export const getAssemblyCodeCache: Selector> = ( diff --git a/src/selectors/per-thread/index.ts b/src/selectors/per-thread/index.ts index 1e667cde24..3fe4e3917e 100644 --- a/src/selectors/per-thread/index.ts +++ b/src/selectors/per-thread/index.ts @@ -241,7 +241,8 @@ export const selectedNodeSelectors: NodeSelectors = (() => { const getLib: Selector = createSelector( selectedThreadSelectors.getSelectedCallNodePath, selectedThreadSelectors.getFilteredThread, - (selectedPath, { stringTable, funcTable, resourceTable }) => { + ProfileSelectors.getSourceTable, + (selectedPath, { stringTable, funcTable, resourceTable }, sources) => { if (!selectedPath.length) { return ''; } @@ -250,7 +251,8 @@ export const selectedNodeSelectors: NodeSelectors = (() => { ProfileData.getLeafFuncIndex(selectedPath), funcTable, resourceTable, - stringTable + stringTable, + sources ); } ); @@ -269,23 +271,23 @@ export const selectedNodeSelectors: NodeSelectors = (() => { const getSourceViewStackLineInfo: Selector = createSelector( selectedThreadSelectors.getFilteredThread, - UrlState.getSourceViewFile, + UrlState.getSourceViewSourceIndex, selectedThreadSelectors.getCallNodeInfo, selectedThreadSelectors.getSelectedCallNodeIndex, ( - { stackTable, frameTable, funcTable, stringTable }: Thread, - sourceViewFile, + { stackTable, frameTable, funcTable }: Thread, + sourceViewSourceIndex, callNodeInfo, selectedCallNodeIndex ): StackLineInfo | null => { - if (sourceViewFile === null || selectedCallNodeIndex === null) { + if (sourceViewSourceIndex === null || selectedCallNodeIndex === null) { return null; } const selectedFunc = callNodeInfo.funcForNode(selectedCallNodeIndex); - const selectedFuncFile = funcTable.fileName[selectedFunc]; + const selectedSourceIndex = funcTable.source[selectedFunc]; if ( - selectedFuncFile === null || - stringTable.getString(selectedFuncFile) !== sourceViewFile + selectedSourceIndex === null || + selectedSourceIndex !== sourceViewSourceIndex ) { return null; } diff --git a/src/selectors/per-thread/markers.ts b/src/selectors/per-thread/markers.ts index afb5b47ed6..333427b3e7 100644 --- a/src/selectors/per-thread/markers.ts +++ b/src/selectors/per-thread/markers.ts @@ -9,7 +9,10 @@ import * as MarkerData from '../../profile-logic/marker-data'; import * as MarkerTimingLogic from '../../profile-logic/marker-timing'; import * as ProfileSelectors from '../profile'; import { getRightClickedMarkerInfo } from '../right-clicked-marker'; -import { getLabelGetter } from '../../profile-logic/marker-schema'; +import { + getLabelGetter, + getSearchTermGetter, +} from '../../profile-logic/marker-schema'; import { getInclusiveSampleIndexRangeForSelection } from '../../profile-logic/profile-data'; import type { BasicThreadSelectorsPerThread } from './thread'; @@ -445,6 +448,20 @@ export function getMarkerSelectorsPerThread( getLabelGetter ); + /** + * This getter extracts the first field value from a marker's tooltipLabel schema + * to use as a search term for filtering. Falls back to the marker name if no + * tooltipLabel is defined. + */ + const getMarkerSearchTermGetter: Selector< + (markerIndex: MarkerIndex) => string + > = createSelector( + getMarkerGetter, + ProfileSelectors.getMarkerSchemaByName, + ProfileSelectors.getStringTable, + getSearchTermGetter + ); + /** * This organizes the result of the previous selector in rows to be nicely * displayed in the marker chart. @@ -750,6 +767,7 @@ export function getMarkerSelectorsPerThread( getMarkerTooltipLabelGetter, getMarkerTableLabelGetter, getMarkerLabelToCopyGetter, + getMarkerSearchTermGetter, getMarkerChartTimingAndBuckets, getCommittedRangeFilteredMarkerIndexes, getTimelineOverviewMarkerIndexes, diff --git a/src/selectors/per-thread/stack-sample.ts b/src/selectors/per-thread/stack-sample.ts index ba16f91acb..5b8b44b079 100644 --- a/src/selectors/per-thread/stack-sample.ts +++ b/src/selectors/per-thread/stack-sample.ts @@ -140,20 +140,15 @@ export function getStackAndSampleSelectorsPerThread( const getSourceViewStackLineInfo: Selector = createSelector( threadSelectors.getFilteredThread, - UrlState.getSourceViewFile, + UrlState.getSourceViewSourceIndex, ( - { stackTable, frameTable, funcTable, stringTable }: Thread, - sourceViewFile + { stackTable, frameTable, funcTable }: Thread, + sourceIndex ): StackLineInfo | null => { - if (sourceViewFile === null) { + if (sourceIndex === null) { return null; } - return getStackLineInfo( - stackTable, - frameTable, - funcTable, - stringTable.indexForString(sourceViewFile) - ); + return getStackLineInfo(stackTable, frameTable, funcTable, sourceIndex); } ); @@ -347,6 +342,7 @@ export function getStackAndSampleSelectorsPerThread( ProfileSelectors.getCategories, getCallTreeTimings, getWeightTypeForCallTree, + ProfileSelectors.getSourceTable, CallTree.getCallTree ); diff --git a/src/selectors/per-thread/thread.tsx b/src/selectors/per-thread/thread.tsx index 78901c348b..fc8b619b89 100644 --- a/src/selectors/per-thread/thread.tsx +++ b/src/selectors/per-thread/thread.tsx @@ -146,6 +146,7 @@ export function getBasicThreadSelectorsPerThread( getSamplesTable, getStackTable, ProfileSelectors.getStringTable, + ProfileSelectors.getSourceTable, ProfileData.createThreadFromDerivedTables ); @@ -338,10 +339,16 @@ export function getBasicThreadSelectorsPerThread( getJsTracerTable, getRawThread, ProfileSelectors.getStringTable, - (jsTracerTable, thread, stringTable) => + ProfileSelectors.getSourceTable, + (jsTracerTable, thread, stringTable, sources) => jsTracerTable === null ? null - : JsTracer.getJsTracerTiming(jsTracerTable, thread, stringTable) + : JsTracer.getJsTracerTiming( + jsTracerTable, + thread, + stringTable, + sources + ) ); /** @@ -465,6 +472,7 @@ export function getThreadSelectorsWithMarkersPerThread( const getFilteredThread: Selector = createSelector( _getImplementationFilteredThread, UrlState.getSearchStrings, + ProfileSelectors.getSourceTable, ProfileData.filterThreadToSearchStrings ); diff --git a/src/selectors/profile.ts b/src/selectors/profile.ts index 13ed4a647b..38d2e68e9e 100644 --- a/src/selectors/profile.ts +++ b/src/selectors/profile.ts @@ -71,6 +71,7 @@ import type { ExtensionTable, SortedTabPageData, TimelineUnit, + SourceTable, } from 'firefox-profiler/types'; import type { ThreadActivityScore } from '../profile-logic/tracks'; @@ -247,6 +248,9 @@ export const getStringTable: Selector = createSelector( (stringArray) => StringTable.withBackingArray(stringArray as string[]) ); +export const getSourceTable: Selector = (state: State) => + getRawProfileSharedData(state).sources; + // Combine the marker schema from Gecko and the front-end. This allows the front-end // to generate markers such as the Jank markers, and display them. export const getMarkerSchema: Selector = createSelector( @@ -912,3 +916,26 @@ export const getProfileUsesMultipleStackTypes: Selector = (state) => { export const getProfileExtraInfo: Selector = createSelector(getProfile, (profile) => profile.meta.extra || []); + +export const getSourceViewFile: Selector = createSelector( + getSourceTable, + getStringTable, + UrlState.getSourceViewSourceIndex, + (sources, stringTable, sourceIndex) => { + if (sourceIndex === null) { + return null; + } + + const fileNameStrIndex = sources.filename[sourceIndex]; + return fileNameStrIndex !== null + ? stringTable.getString(fileNameStrIndex) + : null; + } +); + +export const getSourceViewSourceUuid: Selector = createSelector( + getSourceTable, + UrlState.getSourceViewSourceIndex, + (sources, sourceIndex) => + sourceIndex !== null ? sources.uuid[sourceIndex] : null +); diff --git a/src/selectors/publish.ts b/src/selectors/publish.ts index 8454055256..04397c601d 100644 --- a/src/selectors/publish.ts +++ b/src/selectors/publish.ts @@ -16,8 +16,6 @@ import { getThreads, getMarkerSchemaByName, } from './profile'; -import { compress } from '../utils/gz'; -import { serializeProfile } from '../profile-logic/process-profile'; import { sanitizePII, getShouldSanitizeByDefault as getShouldSanitizeByDefaultImpl, @@ -38,6 +36,7 @@ import type { DerivedMarkerInfo, ThreadIndex, CounterIndex, + SanitizedProfileEncodingState, } from 'firefox-profiler/types'; import { getThreadSelectors } from './per-thread'; @@ -217,23 +216,9 @@ export const getSanitizedProfile: Selector = sanitizePII ); -/** - * Computing the compressed data for a profile is a potentially slow operation. This - * selector and its consumers perform that operation asynchronously. It can be called - * multiple times while adjust the PII sanitization, but should happen in the background. - * It happens in the selector so that it can be shared across components and actions. - * - * Due to this memoization strategy, one copy of the data is retained in memory and - * never freed. - */ -export const getSanitizedProfileData: Selector< - Promise> -> = createSelector(getSanitizedProfile, ({ profile }) => - // We use a Promise.resolve() call first so that the calls to compress and - // serializeProfile are out of React's rendering pipeline. We avoid crashes - // due to memory issues thanks to that. - Promise.resolve().then(() => compress(serializeProfile(profile))) -); +export const getSanitizedProfileEncodingState: Selector< + SanitizedProfileEncodingState +> = (state) => getPublishState(state).sanitizedProfileEncodingState; export const getUploadState: Selector = (state) => getPublishState(state).upload; diff --git a/src/selectors/url-state.ts b/src/selectors/url-state.ts index 21b8d2892b..ecb21e6103 100644 --- a/src/selectors/url-state.ts +++ b/src/selectors/url-state.ts @@ -30,6 +30,7 @@ import type { ProfileSpecificUrlState, NativeSymbolInfo, TabID, + IndexIntoSourceTable, } from 'firefox-profiler/types'; import type { TabSlug } from '../app-logic/tabs-handling'; @@ -69,8 +70,9 @@ export const getShowUserTimings: Selector = (state) => getProfileSpecificState(state).showUserTimings; export const getStackChartSameWidths: Selector = (state) => getProfileSpecificState(state).stackChartSameWidths; -export const getSourceViewFile: Selector = (state) => - getProfileSpecificState(state).sourceView.sourceFile; +export const getSourceViewSourceIndex: Selector = ( + state +) => getProfileSpecificState(state).sourceView.sourceIndex; export const getSourceViewScrollGeneration: Selector = (state) => getProfileSpecificState(state).sourceView.scrollGeneration; export const getAssemblyViewIsOpen: Selector = (state) => diff --git a/src/test/components/CallNodeContextMenu.test.tsx b/src/test/components/CallNodeContextMenu.test.tsx index 29f86db901..c6c159c0fe 100644 --- a/src/test/components/CallNodeContextMenu.test.tsx +++ b/src/test/components/CallNodeContextMenu.test.tsx @@ -14,15 +14,15 @@ import { CallNodeContextMenu } from '../../components/shared/CallNodeContextMenu import { storeWithProfile, blankStore } from '../fixtures/stores'; import { getProfileFromTextSamples } from '../fixtures/profiles/processed-profile'; import { createGeckoProfileWithJsTimings } from '../fixtures/profiles/gecko-profile'; +import { addSourceToTable, fireFullClick } from '../fixtures/utils'; import { changeRightClickedCallNode, changeExpandedCallNodes, setContextMenuVisibility, } from '../../actions/profile-view'; import { selectedThreadSelectors } from '../../selectors/per-thread'; -import { getSourceViewFile } from '../../selectors/url-state'; +import { getSourceViewFile } from '../../selectors/profile'; import { ensureExists } from '../../utils/types'; -import { fireFullClick } from '../fixtures/utils'; import { createBrowserConnection } from '../../app-logic/browser-connection'; import { updateBrowserConnectionStatus } from 'firefox-profiler/actions/app'; import { simulateWebChannel } from '../fixtures/mocks/web-channel'; @@ -67,13 +67,16 @@ describe('calltree/CallNodeContextMenu', function () { 'https://example.com/script.js' ); + // Create a source entry + const sourceIndex = addSourceToTable(profile.shared.sources, fileNameIndex); + const funcIndexA = funcNames.indexOf('A.js'); - thread.funcTable.fileName[funcIndexA] = fileNameIndex; + thread.funcTable.source[funcIndexA] = sourceIndex; thread.funcTable.lineNumber[funcIndexA] = 1; thread.funcTable.columnNumber[funcIndexA] = 111; const funcIndexB = funcNames.indexOf('B.js'); - thread.funcTable.fileName[funcIndexB] = fileNameIndex; + thread.funcTable.source[funcIndexB] = sourceIndex; thread.funcTable.lineNumber[funcIndexB] = 2; thread.funcTable.columnNumber[funcIndexB] = 222; diff --git a/src/test/components/FlameGraph.test.tsx b/src/test/components/FlameGraph.test.tsx index 4b3bcf514e..88bb561d8f 100644 --- a/src/test/components/FlameGraph.test.tsx +++ b/src/test/components/FlameGraph.test.tsx @@ -11,10 +11,8 @@ import copy from 'copy-to-clipboard'; import { render, act } from 'firefox-profiler/test/fixtures/testing-library'; import { FlameGraph } from '../../components/flame-graph'; import { CallNodeContextMenu } from '../../components/shared/CallNodeContextMenu'; -import { - getInvertCallstack, - getSourceViewFile, -} from '../../selectors/url-state'; +import { getInvertCallstack } from '../../selectors/url-state'; +import { getSourceViewFile } from '../../selectors/profile'; import { ensureExists } from '../../utils/types'; import { getEmptyThread, @@ -43,6 +41,7 @@ import { fireFullClick, fireFullContextMenu, findFillTextPositionFromDrawLog, + addSourceToTable, } from '../fixtures/utils'; import { getProfileFromTextSamples } from '../fixtures/profiles/processed-profile'; import { mockRaf } from '../fixtures/mocks/request-animation-frame'; @@ -293,18 +292,30 @@ function setupFlameGraph() { // Add some file and line number to the profile so that tooltips generate // an interesting snapshot. const { funcTable } = profile.threads[0]; + + // Create source entries. + const defaultFileIndex = stringTable.indexForString('path/to/file'); + const defaultSourceIndex = addSourceToTable( + profile.shared.sources, + defaultFileIndex + ); + + const bFileIndex = stringTable.indexForString('path/for/B'); + const bSourceIndex = addSourceToTable(profile.shared.sources, bFileIndex); + + const jFileIndex = stringTable.indexForString( + 'hg:hg.mozilla.org/mozilla-central:widget/cocoa/nsAppShell.mm:997f00815e6bc28806b75448c8829f0259d2cb28' + ); + const jSourceIndex = addSourceToTable(profile.shared.sources, jFileIndex); + for (let funcIndex = 0; funcIndex < funcTable.length; funcIndex++) { funcTable.lineNumber[funcIndex] = funcIndex + 10; funcTable.columnNumber[funcIndex] = funcIndex + 100; - funcTable.fileName[funcIndex] = stringTable.indexForString('path/to/file'); + funcTable.source[funcIndex] = defaultSourceIndex; } - funcTable.fileName[funcNamesDict.B] = - stringTable.indexForString('path/for/B'); - - funcTable.fileName[funcNamesDict.J] = stringTable.indexForString( - 'hg:hg.mozilla.org/mozilla-central:widget/cocoa/nsAppShell.mm:997f00815e6bc28806b75448c8829f0259d2cb28' - ); + funcTable.source[funcNamesDict.B] = bSourceIndex; + funcTable.source[funcNamesDict.J] = jSourceIndex; const store = storeWithProfile(profile); store.dispatch(changeSelectedTab('flame-graph')); diff --git a/src/test/components/MenuButtons.test.tsx b/src/test/components/MenuButtons.test.tsx index 13f76e8012..9d38bc26ca 100644 --- a/src/test/components/MenuButtons.test.tsx +++ b/src/test/components/MenuButtons.test.tsx @@ -226,7 +226,7 @@ describe('app/MenuButtons', function () { screen.getByRole('checkbox', { name: /Include the data from other tabs/, }); - const getPanel = () => screen.getByTestId('MenuButtonsPublish-container'); + const getPanel = () => screen.getByTestId('PublishPanel-container'); const openPublishPanel = async () => { fireFullClick(getPublishButton()); await screen.findByText(/^(Share|Re-upload) Performance Profile$/); diff --git a/src/test/components/Root.test.tsx b/src/test/components/Root.test.tsx index 28b0d9d57a..fcecaf1702 100644 --- a/src/test/components/Root.test.tsx +++ b/src/test/components/Root.test.tsx @@ -135,11 +135,11 @@ describe('app/AppViewRouter', function () { const { container, dispatch, - navigateToStoreLoadingPage, + navigateToFromFileProfileLoadingPage, navigateBackToHome, } = setup(); - navigateToStoreLoadingPage(); + navigateToFromFileProfileLoadingPage(); dispatch(fatalError(new Error('Error while loading profile'))); expect(container.firstChild).toMatchSnapshot(); expect(console.error).toHaveBeenCalled(); @@ -148,6 +148,15 @@ describe('app/AppViewRouter', function () { expect(container.firstChild).toMatchSnapshot(); }); + it('does not render back home link when not opened with from-file', function () { + const { container, dispatch, navigateToStoreLoadingPage } = setup(); + + navigateToStoreLoadingPage(); + dispatch(fatalError(new Error('Error while loading profile'))); + expect(container.firstChild).toMatchSnapshot(); + expect(console.error).toHaveBeenCalled(); + }); + it('renders a compare home when navigating to /compare/, then loads when changing profiles', () => { const { container, dispatch, navigateToCompareHome } = setup(); @@ -211,6 +220,15 @@ function setup() { actAndDispatch(updateUrlState(newUrlState)); } + function navigateToFromFileProfileLoadingPage() { + const newUrlState = stateFromLocation({ + pathname: '/from-file/calltree', + search: '', + hash: '', + }); + actAndDispatch(updateUrlState(newUrlState)); + } + function navigateBackToHome() { const newUrlState = stateFromLocation({ pathname: '/', @@ -243,6 +261,7 @@ function setup() { dispatch: actAndDispatch, navigateToStoreLoadingPage, navigateToFromBrowserProfileLoadingPage, + navigateToFromFileProfileLoadingPage, navigateBackToHome, navigateToCompareHome, navigateToMyProfiles, diff --git a/src/test/components/StackChart.test.tsx b/src/test/components/StackChart.test.tsx index 3181a25957..19b0a69a56 100644 --- a/src/test/components/StackChart.test.tsx +++ b/src/test/components/StackChart.test.tsx @@ -12,6 +12,7 @@ import { within, } from 'firefox-profiler/test/fixtures/testing-library'; import * as UrlStateSelectors from '../../selectors/url-state'; +import * as ProfileSelectors from '../../selectors/profile'; // This module is mocked. import copy from 'copy-to-clipboard'; @@ -195,11 +196,12 @@ describe('StackChart', function () { dispatch(changeSelectedCallNode(0, [funcNames.indexOf('A')])); }); - expect(UrlStateSelectors.getSourceViewFile(getState())).toBeNull(); + expect(UrlStateSelectors.getSourceViewSourceIndex(getState())).toBeNull(); fireFullKeyPress(stackChartCanvas, { key: 'Enter' }); - expect(UrlStateSelectors.getSourceViewFile(getState())).toBe( - sourceViewFile - ); + expect( + UrlStateSelectors.getSourceViewSourceIndex(getState()) + ).not.toBeNull(); + expect(ProfileSelectors.getSourceViewFile(getState())).toBe(sourceViewFile); }); it('can display a context menu when right clicking the chart', function () { diff --git a/src/test/components/TooltipMarker.test.tsx b/src/test/components/TooltipMarker.test.tsx index 70f584966b..2bb92521f0 100644 --- a/src/test/components/TooltipMarker.test.tsx +++ b/src/test/components/TooltipMarker.test.tsx @@ -4,7 +4,11 @@ import { Provider } from 'react-redux'; -import { render, screen } from 'firefox-profiler/test/fixtures/testing-library'; +import { + render, + screen, + fireEvent, +} from 'firefox-profiler/test/fixtures/testing-library'; import { TooltipMarker } from '../../components/tooltip/Marker'; import { storeWithProfile } from '../fixtures/stores'; import { @@ -19,7 +23,10 @@ import { type NetworkMarkersOptions, } from '../fixtures/profiles/processed-profile'; import { selectedThreadSelectors } from 'firefox-profiler/selectors/per-thread'; -import { getSelectedThreadsKey } from 'firefox-profiler/selectors/url-state'; +import { + getSelectedThreadsKey, + getMarkersSearchString, +} from 'firefox-profiler/selectors/url-state'; import { changeSelectedThreads } from 'firefox-profiler/actions/profile-view'; import { getEmptyThread } from '../../profile-logic/data-structures'; import { ensureExists } from 'firefox-profiler/utils/types'; @@ -1324,4 +1331,103 @@ describe('TooltipMarker', function () { const trackInfo = trackTitle.nextSibling; expect(trackInfo).toHaveTextContent(tab2Domain); }); + + describe('filter button', () => { + it('shows the filter button for markers without spaces in the label', () => { + // Tooltip label: "Reflow" + const profile = getProfileWithMarkers([ + ['Reflow', 1, 2, { type: 'tracing', category: 'Paint' }], + ]); + const store = storeWithProfile(profile); + const state = store.getState(); + const getMarker = selectedThreadSelectors.getMarkerGetter(state); + const markerIndexes = + selectedThreadSelectors.getFullMarkerListIndexes(state); + + render( + + + + ); + + const filterButton = screen.getByRole('button', { + name: /only show markers matching: “\u2068Reflow\u2069”/i, + }); + expect(filterButton).toBeInTheDocument(); + }); + + it('shows the filter button and uses the first field for markers with multiple fields', () => { + // Tooltip label: "click — DOMEvent" + // The filter button should use just the first field "click" as the search term + const profile = getProfileWithMarkers([ + ['DOMEvent', 1, 2, { type: 'DOMEvent', eventType: 'click' }], + ]); + const store = storeWithProfile(profile); + const state = store.getState(); + const getMarker = selectedThreadSelectors.getMarkerGetter(state); + const markerIndexes = + selectedThreadSelectors.getFullMarkerListIndexes(state); + + render( + + + + ); + + // The filter button should be present and use the first field "click" + const filterButton = screen.getByRole('button', { + name: /only show markers matching: “\u2068click\u2069”/i, + }); + expect(filterButton).toBeInTheDocument(); + + // Verify clicking the button sets the search string to just "click" + fireEvent.click(filterButton); + expect(getMarkersSearchString(store.getState())).toBe('click'); + }); + + it('sets the marker search string when the filter button is clicked', () => { + const profile = getProfileWithMarkers([ + ['Reflow', 1, 2, { type: 'tracing', category: 'Paint' }], + ]); + const store = storeWithProfile(profile); + const state = store.getState(); + const getMarker = selectedThreadSelectors.getMarkerGetter(state); + const markerIndexes = + selectedThreadSelectors.getFullMarkerListIndexes(state); + + render( + + + + ); + + const filterButton = screen.getByRole('button', { + name: /only show markers matching: “\u2068Reflow\u2069”/i, + }); + + // Initially, the search string should be empty + expect(getMarkersSearchString(store.getState())).toBe(''); + + // Click the filter button + fireEvent.click(filterButton); + + // The search string should now be set to the marker label + expect(getMarkersSearchString(store.getState())).toBe('Reflow'); + }); + }); }); diff --git a/src/test/components/__snapshots__/MarkerChart.test.tsx.snap b/src/test/components/__snapshots__/MarkerChart.test.tsx.snap index 3bc301d4fc..68263b885b 100644 --- a/src/test/components/__snapshots__/MarkerChart.test.tsx.snap +++ b/src/test/components/__snapshots__/MarkerChart.test.tsx.snap @@ -181,7 +181,17 @@ exports[`MarkerChart persists the selected marker tooltips properly 1`] = `
    - Marker B + + Marker B + +
    @@ -364,7 +374,17 @@ exports[`MarkerChart renders the hoveredItem markers properly 2`] = `
    - Marker B + + Marker B + +
    diff --git a/src/test/components/__snapshots__/MarkerSidebar.test.tsx.snap b/src/test/components/__snapshots__/MarkerSidebar.test.tsx.snap index 9253ad2fdc..4ebd959746 100644 --- a/src/test/components/__snapshots__/MarkerSidebar.test.tsx.snap +++ b/src/test/components/__snapshots__/MarkerSidebar.test.tsx.snap @@ -24,7 +24,17 @@ exports[`MarkerSidebar matches the snapshots when displaying data about the curr
    - IPC — sent to 2222 + + IPC — sent to 2222 + +
    diff --git a/src/test/components/__snapshots__/MenuButtons.test.tsx.snap b/src/test/components/__snapshots__/MenuButtons.test.tsx.snap index cd16d67c16..388a311171 100644 --- a/src/test/components/__snapshots__/MenuButtons.test.tsx.snap +++ b/src/test/components/__snapshots__/MenuButtons.test.tsx.snap @@ -1891,18 +1891,18 @@ exports[`app/MenuButtons can publish and revert 1`] = ` exports[`app/MenuButtons matches the snapshot for a compression error 1`] = `

    Share Performance Profile

    @@ -267,7 +287,17 @@ exports[`TooltipMarker renders properly network markers where content type is bl
    - Load 1235: https://img.buzzfeed.com/buzzfeed-static/static/2018-04/29/11/tmp/buzzfeed-prod-web-02/tmp-name-2-18011-1525016782-0_dblwide.jpg?output-format=auto&output-quality=auto&resize=625:* + + Load 1235: https://img.buzzfeed.com/buzzfeed-static/static/2018-04/29/11/tmp/buzzfeed-prod-web-02/tmp-name-2-18011-1525016782-0_dblwide.jpg?output-format=auto&output-quality=auto&resize=625:* + +
    @@ -438,7 +468,17 @@ exports[`TooltipMarker renders properly network markers where content type is mi
    - Load 1235: https://img.buzzfeed.com/buzzfeed-static/static/2018-04/29/11/tmp/buzzfeed-prod-web-02/tmp-name-2-18011-1525016782-0_dblwide.jpg?output-format=auto&output-quality=auto&resize=625:* + + Load 1235: https://img.buzzfeed.com/buzzfeed-static/static/2018-04/29/11/tmp/buzzfeed-prod-web-02/tmp-name-2-18011-1525016782-0_dblwide.jpg?output-format=auto&output-quality=auto&resize=625:* + +
    @@ -634,7 +674,17 @@ exports[`TooltipMarker renders properly network markers with a preconnect part 2
    - Load 1235: https://img.buzzfeed.com/buzzfeed-static/static/2018-04/29/11/tmp/buzzfeed-prod-web-02/tmp-name-2-18011-1525016782-0_dblwide.jpg?output-format=auto&output-quality=auto&resize=625:* + + Load 1235: https://img.buzzfeed.com/buzzfeed-static/static/2018-04/29/11/tmp/buzzfeed-prod-web-02/tmp-name-2-18011-1525016782-0_dblwide.jpg?output-format=auto&output-quality=auto&resize=625:* + +
    @@ -894,7 +944,17 @@ exports[`TooltipMarker renders properly network markers with a preconnect part c
    - Load 1235: https://img.buzzfeed.com/buzzfeed-static/static/2018-04/29/11/tmp/buzzfeed-prod-web-02/tmp-name-2-18011-1525016782-0_dblwide.jpg?output-format=auto&output-quality=auto&resize=625:* + + Load 1235: https://img.buzzfeed.com/buzzfeed-static/static/2018-04/29/11/tmp/buzzfeed-prod-web-02/tmp-name-2-18011-1525016782-0_dblwide.jpg?output-format=auto&output-quality=auto&resize=625:* + +
    @@ -1080,7 +1140,17 @@ exports[`TooltipMarker renders properly normal network markers 1`] = `
    - Load 1235: https://img.buzzfeed.com/buzzfeed-static/static/2018-04/29/11/tmp/buzzfeed-prod-web-02/tmp-name-2-18011-1525016782-0_dblwide.jpg?output-format=auto&output-quality=auto&resize=625:* + + Load 1235: https://img.buzzfeed.com/buzzfeed-static/static/2018-04/29/11/tmp/buzzfeed-prod-web-02/tmp-name-2-18011-1525016782-0_dblwide.jpg?output-format=auto&output-quality=auto&resize=625:* + +
    @@ -1334,7 +1404,17 @@ exports[`TooltipMarker renders properly redirect network markers for a Internal
    - Load 1234: http://www.wikia.com/ + + Load 1234: http://www.wikia.com/ + +
    @@ -1447,7 +1527,17 @@ exports[`TooltipMarker renders properly redirect network markers for a Permanent
    - Load 1234: http://www.wikia.com/ + + Load 1234: http://www.wikia.com/ + +
    @@ -1560,7 +1650,17 @@ exports[`TooltipMarker renders properly redirect network markers for a Temporary
    - Load 1234: http://www.wikia.com/ + + Load 1234: http://www.wikia.com/ + +
    @@ -1673,7 +1773,17 @@ exports[`TooltipMarker renders properly redirect network markers for an internal
    - Load 1234: http://www.wikia.com/ + + Load 1234: http://www.wikia.com/ + +
    @@ -1786,7 +1896,17 @@ exports[`TooltipMarker renders properly redirect network markers without additio
    - Load 1234: http://www.wikia.com/ + + Load 1234: http://www.wikia.com/ + +
    @@ -1894,7 +2014,17 @@ exports[`TooltipMarker renders the tooltip of CompositorScreenshotWindowDestroye
    - CompositorScreenshotWindowDestroyed + + CompositorScreenshotWindowDestroyed + +
    @@ -1941,7 +2071,17 @@ exports[`TooltipMarker renders tooltips for various markers: Bailout_ShapeGuard
    - Bailout_ShapeGuard after getelem on line 3666 of resource://foo.js -> resource://bar.js:3662 + + Bailout_ShapeGuard after getelem on line 3666 of resource://foo.js -> resource://bar.js:3662 + +
    @@ -1972,7 +2112,17 @@ exports[`TooltipMarker renders tooltips for various markers: Bailout-10 1`] = `
    - Bailout + + Bailout + +
    @@ -2010,7 +2160,17 @@ exports[`TooltipMarker renders tooltips for various markers: BailoutKind::Argume
    - BailoutKind::ArgumentCheck at Uninitialized on line 388 of self-hosted:388 + + BailoutKind::ArgumentCheck at Uninitialized on line 388 of self-hosted:388 + +
    @@ -2046,7 +2206,17 @@ exports[`TooltipMarker renders tooltips for various markers: DOMEvent-10.5 1`] =
    - commandupdate — DOMEvent + + commandupdate — DOMEvent + +
    @@ -2110,7 +2280,17 @@ exports[`TooltipMarker renders tooltips for various markers: DOMEvent-10.6 1`] =
    - load — DOMEvent + + load — DOMEvent + +
    @@ -2172,7 +2352,17 @@ exports[`TooltipMarker renders tooltips for various markers: DOMEvent-10.7 1`] =
    - load — DOMEvent + + load — DOMEvent + +
    @@ -2234,7 +2424,17 @@ exports[`TooltipMarker renders tooltips for various markers: DOMEvent-10.8 1`] =
    - load — DOMEvent + + load — DOMEvent + +
    @@ -2297,7 +2497,17 @@ exports[`TooltipMarker renders tooltips for various markers: FileIO (non-profile
    - FileIO (non-profiled thread) + + FileIO (non-profiled thread) + +
    @@ -2627,7 +2837,17 @@ exports[`TooltipMarker renders tooltips for various markers: FileIO-114 1`] = `
    - FileIO + + FileIO + +
    @@ -2945,7 +3165,17 @@ exports[`TooltipMarker renders tooltips for various markers: GCMajor-16.5 1`] =
    - GCMajor + + GCMajor + +
    @@ -3102,7 +3332,17 @@ exports[`TooltipMarker renders tooltips for various markers: GCMinor-15.5 1`] =
    - GCMinor + + GCMinor + +
    @@ -3217,7 +3457,17 @@ exports[`TooltipMarker renders tooltips for various markers: GCSlice-17.5 1`] =
    - GCSlice + + GCSlice + +
    @@ -3295,7 +3545,17 @@ exports[`TooltipMarker renders tooltips for various markers: IPCOut-120 1`] = `
    - IPC — sent to 2222 + + IPC — sent to 2222 + +
    @@ -3382,7 +3642,17 @@ exports[`TooltipMarker renders tooltips for various markers: Invalidate http://m
    - Invalidate http://mozilla.com/script.js:1234 + + Invalidate http://mozilla.com/script.js:1234 + +
    @@ -3413,7 +3683,17 @@ exports[`TooltipMarker renders tooltips for various markers: Invalidate-10 1`] =
    - Invalidate + + Invalidate + +
    @@ -3451,7 +3731,17 @@ exports[`TooltipMarker renders tooltips for various markers: Log-21.7 1`] = `
    - Log + + Log + +
    @@ -3496,7 +3786,17 @@ exports[`TooltipMarker renders tooltips for various markers: NotifyDidPaint-14.5
    - NotifyDidPaint + + NotifyDidPaint + +
    @@ -3539,7 +3839,17 @@ exports[`TooltipMarker renders tooltips for various markers: NotifyDidPaint-112.
    - NotifyDidPaint + + NotifyDidPaint + +
    @@ -3577,7 +3887,17 @@ exports[`TooltipMarker renders tooltips for various markers: PlayAudio-115 1`] =
    - PlayAudio + + PlayAudio + +
    @@ -3622,7 +3942,17 @@ exports[`TooltipMarker renders tooltips for various markers: PreferenceRead-114.
    - PreferenceRead + + PreferenceRead + +
    @@ -3686,7 +4016,17 @@ exports[`TooltipMarker renders tooltips for various markers: RefreshObserver-122
    - RefreshObserver + + RefreshObserver + +
    @@ -3990,7 +4330,17 @@ exports[`TooltipMarker renders tooltips for various markers: Styles-18.5 1`] = `
    - Styles + + Styles + +
    @@ -4299,7 +4649,17 @@ exports[`TooltipMarker renders tooltips for various markers: Styles-20 1`] = `
    - Styles + + Styles + +
    @@ -4631,7 +4991,17 @@ exports[`TooltipMarker renders tooltips for various markers: TimeToFirstInteract
    - TimeToFirstInteractive (TTFI) + + TimeToFirstInteractive (TTFI) + +
    @@ -4674,7 +5044,17 @@ exports[`TooltipMarker renders tooltips for various markers: UserTiming-12.5 1`]
    - foobar + + foobar + +
    @@ -4735,7 +5115,17 @@ exports[`TooltipMarker shows a tooltip for Jank markers 1`] = `
    - Jank – event processing delay + + Jank – event processing delay + +
    @@ -4782,7 +5172,17 @@ exports[`TooltipMarker shows image of CompositorScreenshot markers 1`] = `
    - CompositorScreenshot + + CompositorScreenshot + +
    @@ -4855,7 +5255,17 @@ exports[`TooltipMarker shows the source thread for markers from a merged thread
    - click — DOMEvent + + click — DOMEvent + +
    @@ -4923,7 +5333,17 @@ exports[`TooltipMarker shows the source thread for markers from a merged thread
    - pageload — DOMEvent + + pageload — DOMEvent + +
    diff --git a/src/test/components/__snapshots__/TrackCustomMarker.test.tsx.snap b/src/test/components/__snapshots__/TrackCustomMarker.test.tsx.snap index 2c41d62675..ab6fc687f2 100644 --- a/src/test/components/__snapshots__/TrackCustomMarker.test.tsx.snap +++ b/src/test/components/__snapshots__/TrackCustomMarker.test.tsx.snap @@ -25,7 +25,17 @@ exports[`TrackCustomMarker has a tooltip that matches the snapshot 1`] = `
    - Marker + + Marker + +
    diff --git a/src/test/components/__snapshots__/TrackNetwork.test.tsx.snap b/src/test/components/__snapshots__/TrackNetwork.test.tsx.snap index d750fc9ee5..80f9a8118f 100644 --- a/src/test/components/__snapshots__/TrackNetwork.test.tsx.snap +++ b/src/test/components/__snapshots__/TrackNetwork.test.tsx.snap @@ -56,7 +56,17 @@ exports[`timeline/TrackNetwork draws differently a request and displays a toolti
    - Load 0: https://mozilla.org + + Load 0: https://mozilla.org + +
    diff --git a/src/test/fixtures/profiles/call-nodes.ts b/src/test/fixtures/profiles/call-nodes.ts index 0311c75220..fcc88e636b 100644 --- a/src/test/fixtures/profiles/call-nodes.ts +++ b/src/test/fixtures/profiles/call-nodes.ts @@ -51,7 +51,7 @@ export default function getProfile(): Profile { isJS: Array(funcNames.length).fill(false), resource: Array(funcNames.length).fill(-1), relevantForJS: Array(funcNames.length).fill(false), - fileName: Array(funcNames.length).fill(''), + source: Array(funcNames.length).fill(null), lineNumber: Array(funcNames.length).fill(null), columnNumber: Array(funcNames.length).fill(null), length: funcNames.length, diff --git a/src/test/fixtures/profiles/processed-profile.ts b/src/test/fixtures/profiles/processed-profile.ts index 0adcbd959a..5813a8e4e8 100644 --- a/src/test/fixtures/profiles/processed-profile.ts +++ b/src/test/fixtures/profiles/processed-profile.ts @@ -60,7 +60,7 @@ import { computeTimeColumnForRawSamplesTable, } from '../../../profile-logic/profile-data'; import { markerSchemaForTests } from './marker-schema'; -import { GlobalDataCollector } from 'firefox-profiler/profile-logic/process-profile'; +import { GlobalDataCollector } from 'firefox-profiler/profile-logic/global-data-collector'; import { getVisualMetrics } from './gecko-profile'; // Array<[MarkerName, Milliseconds, Data]> @@ -900,7 +900,7 @@ function _buildThreadFromTextOnlyStacks( // Create the FuncTable. funcNames.forEach((funcName) => { funcTable.name.push(stringTable.indexForString(funcName)); - funcTable.fileName.push(null); + funcTable.source.push(null); funcTable.relevantForJS.push(funcName.endsWith('-relevantForJS')); funcTable.isJS.push(_isJsFunctionName(funcName)); funcTable.lineNumber.push(null); @@ -955,7 +955,10 @@ function _buildThreadFromTextOnlyStacks( // Find the file name from the function name const fileName = _findFileNameFromFuncName(funcNameWithModifier); if (fileName) { - funcTable.fileName[funcIndex] = stringTable.indexForString(fileName); + funcTable.source[funcIndex] = globalDataCollector.indexForSource( + null, + fileName + ); } const category = _findCategoryFromFuncName( diff --git a/src/test/fixtures/utils.ts b/src/test/fixtures/utils.ts index 580f26e21a..475cf7a3c4 100644 --- a/src/test/fixtures/utils.ts +++ b/src/test/fixtures/utils.ts @@ -34,6 +34,7 @@ import type { RawThread, IndexIntoCategoryList, SampleUnits, + SourceTable, } from 'firefox-profiler/types'; import { ensureExists } from 'firefox-profiler/utils/types'; @@ -156,7 +157,8 @@ export function computeThreadFromRawThread( rawThread, samples, stackTable, - stringTable + stringTable, + shared.sources ); } @@ -316,8 +318,14 @@ export function formatStack( stack: IndexIntoStackTable ): string { const lines = []; - const { stackTable, frameTable, funcTable, stringTable, resourceTable } = - thread; + const { + stackTable, + frameTable, + funcTable, + stringTable, + resourceTable, + sources, + } = thread; for ( let stackIndex: IndexIntoStackTable | null = stack; stackIndex !== null; @@ -333,6 +341,7 @@ export function formatStack( funcTable, resourceTable, stringTable, + sources, frameLine, frameColumn ); @@ -608,3 +617,29 @@ function isControlInput(element: HTMLElement): boolean { ['button', 'submit', 'clear'].includes(element.type || '')) ); } + +/** + * Adds a source entry to the sources table and returns the index. + * If a source with the same URL already exists, returns the existing index. + * This is a test utility for setting up test profiles. + */ +export function addSourceToTable( + sources: SourceTable, + urlStringIndex: number, + uuid: string | null = null +): number { + // Check if source already exists + for (let i = 0; i < sources.filename.length; i++) { + if (sources.filename[i] === urlStringIndex && sources.uuid[i] === uuid) { + return i; + } + } + + // Add new source entry + const sourceIndex = sources.filename.length; + sources.filename.push(urlStringIndex); + sources.uuid.push(uuid); + sources.length = sources.filename.length; + + return sourceIndex; +} diff --git a/src/test/integration/symbolicator-cli/__snapshots__/symbolicator-cli.test.ts.snap b/src/test/integration/symbolicator-cli/__snapshots__/symbolicator-cli.test.ts.snap index 379f1a7b3c..2e547d427a 100644 --- a/src/test/integration/symbolicator-cli/__snapshots__/symbolicator-cli.test.ts.snap +++ b/src/test/integration/symbolicator-cli/__snapshots__/symbolicator-cli.test.ts.snap @@ -87,7 +87,7 @@ Object { "markerSchema": Array [], "oscpu": "macOS 14.6.1", "pausedRanges": Array [], - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "a.out", "sampleUnits": Object { @@ -104,6 +104,11 @@ Object { "pages": Array [], "profilerOverhead": Array [], "shared": Object { + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stringArray": Array [ "0x6153", "0x3ec3", @@ -207,12 +212,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -244,6 +243,12 @@ Object { 2, 3, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": true, "markers": Object { @@ -476,14 +481,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -525,6 +522,14 @@ Object { 2, 3, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -743,15 +748,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -798,6 +794,15 @@ Object { 3, 1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -1034,15 +1039,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -1089,6 +1085,15 @@ Object { 3, 1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -1383,19 +1388,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -1462,6 +1454,19 @@ Object { 0, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -1762,15 +1767,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -1817,6 +1813,15 @@ Object { 3, 1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -2103,7 +2108,7 @@ Object { "markerSchema": Array [], "oscpu": "macOS 14.6.1", "pausedRanges": Array [], - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "a.out", "sampleUnits": Object { @@ -2120,6 +2125,11 @@ Object { "pages": Array [], "profilerOverhead": Array [], "shared": Object { + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stringArray": Array [ "0x6153", "0x3ec3", @@ -2223,12 +2233,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -2260,6 +2264,12 @@ Object { 2, 3, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": true, "markers": Object { @@ -2492,14 +2502,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -2541,6 +2543,14 @@ Object { 2, 3, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -2759,15 +2769,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -2814,6 +2815,15 @@ Object { 3, 1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -3050,15 +3060,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -3105,6 +3106,15 @@ Object { 3, 1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -3399,19 +3409,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -3478,6 +3475,19 @@ Object { 0, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -3778,15 +3788,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -3833,6 +3834,15 @@ Object { 3, 1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { diff --git a/src/test/store/__snapshots__/profile-view.test.ts.snap b/src/test/store/__snapshots__/profile-view.test.ts.snap index 97b694c07f..a8c4c9ec9e 100644 --- a/src/test/store/__snapshots__/profile-view.test.ts.snap +++ b/src/test/store/__snapshots__/profile-view.test.ts.snap @@ -418,7 +418,7 @@ Object { "oscpu": "", "physicalCPUs": 0, "platform": "", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Firefox", "sourceURL": "", @@ -426,7 +426,7 @@ Object { "startTime": 0, "symbolicated": true, "toolkit": "", - "version": 31, + "version": 32, }, "pages": Array [ Object { @@ -437,6 +437,11 @@ Object { }, ], "shared": Object { + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stringArray": Array [ "A", "B", @@ -567,17 +572,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -634,6 +628,17 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -891,13 +896,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -1179,17 +1184,6 @@ Array [ null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -1246,6 +1240,17 @@ Array [ -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -1503,13 +1508,13 @@ Array [ }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -2747,17 +2752,6 @@ CallTree { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -2814,6 +2808,17 @@ CallTree { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isJsTracer": undefined, "isMainThread": false, @@ -2876,6 +2881,11 @@ CallTree { "weightType": "samples", }, "showMarkersInTimeline": undefined, + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stackTable": Object { "category": Array [ 0, @@ -3076,17 +3086,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -3143,6 +3142,17 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isJsTracer": undefined, "isMainThread": false, @@ -3205,6 +3215,11 @@ Object { "weightType": "samples", }, "showMarkersInTimeline": undefined, + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stackTable": Object { "category": Array [ 0, @@ -3483,17 +3498,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -3550,6 +3554,17 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isJsTracer": undefined, "isMainThread": false, @@ -3606,6 +3621,11 @@ Object { "weightType": "samples", }, "showMarkersInTimeline": undefined, + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stackTable": Object { "category": Array [ 0, @@ -3804,17 +3824,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -3871,6 +3880,17 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isJsTracer": undefined, "isMainThread": false, @@ -3933,6 +3953,11 @@ Object { "weightType": "samples", }, "showMarkersInTimeline": undefined, + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stackTable": Object { "category": Array [ 0, @@ -4131,17 +4156,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -4198,6 +4212,17 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isJsTracer": undefined, "isMainThread": false, @@ -4260,6 +4285,11 @@ Object { "weightType": "samples", }, "showMarkersInTimeline": undefined, + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stackTable": Object { "category": Array [ 0, diff --git a/src/test/store/bottom-box.test.ts b/src/test/store/bottom-box.test.ts index 18de69f344..2007e02f84 100644 --- a/src/test/store/bottom-box.test.ts +++ b/src/test/store/bottom-box.test.ts @@ -5,6 +5,7 @@ import { getProfileFromTextSamples } from '../fixtures/profiles/processed-profile'; import { storeWithProfile } from '../fixtures/stores'; import * as UrlStateSelectors from '../../selectors/url-state'; +import * as ProfileSelectors from '../../selectors/profile'; import { selectedThreadSelectors, selectedNodeSelectors, @@ -65,7 +66,7 @@ describe('bottom box', function () { const { getState } = setup(); expect(UrlStateSelectors.getIsBottomBoxOpen(getState())).toBeFalse(); expect(UrlStateSelectors.getSelectedTab(getState())).toBe('calltree'); - expect(UrlStateSelectors.getSourceViewFile(getState())).toBeNull(); + expect(UrlStateSelectors.getSourceViewSourceIndex(getState())).toBeNull(); expect(UrlStateSelectors.getAssemblyViewIsOpen(getState())).toBeFalse(); expect( UrlStateSelectors.getAssemblyViewNativeSymbol(getState()) @@ -102,7 +103,7 @@ describe('bottom box', function () { // Now the source view should be displayed and the assembly view should be // initialized but closed. expect(UrlStateSelectors.getIsBottomBoxOpen(getState())).toBeTrue(); - expect(UrlStateSelectors.getSourceViewFile(getState())).toBe('cde.cpp'); + expect(ProfileSelectors.getSourceViewFile(getState())).toBe('cde.cpp'); expect(UrlStateSelectors.getAssemblyViewIsOpen(getState())).toBeFalse(); expect(UrlStateSelectors.getAssemblyViewNativeSymbol(getState())).toEqual( nativeSymbolInfoD @@ -126,7 +127,7 @@ describe('bottom box', function () { dispatch(changeSelectedTab('flame-graph')); expect(UrlStateSelectors.getSelectedTab(getState())).toBe('flame-graph'); expect(UrlStateSelectors.getIsBottomBoxOpen(getState())).toBeFalse(); - expect(UrlStateSelectors.getSourceViewFile(getState())).toBe('cde.cpp'); + expect(ProfileSelectors.getSourceViewFile(getState())).toBe('cde.cpp'); expect(UrlStateSelectors.getAssemblyViewNativeSymbol(getState())).toEqual( nativeSymbolInfoD ); @@ -188,7 +189,7 @@ describe('bottom box', function () { // Now the assembly view should be opened because there's no source to display. expect(UrlStateSelectors.getIsBottomBoxOpen(getState())).toBeTrue(); - expect(UrlStateSelectors.getSourceViewFile(getState())).toBeNull(); + expect(ProfileSelectors.getSourceViewFile(getState())).toBeNull(); expect(UrlStateSelectors.getAssemblyViewIsOpen(getState())).toBeTrue(); expect(UrlStateSelectors.getAssemblyViewNativeSymbol(getState())).toEqual( nativeSymbolInfoF @@ -198,7 +199,7 @@ describe('bottom box', function () { // Double-click a node with source information again. The assembly view should remain open. dispatch(updateBottomBoxContentsAndMaybeOpen('calltree', bottomBoxInfoD)); expect(UrlStateSelectors.getIsBottomBoxOpen(getState())).toBeTrue(); - expect(UrlStateSelectors.getSourceViewFile(getState())).toBe('cde.cpp'); + expect(ProfileSelectors.getSourceViewFile(getState())).toBe('cde.cpp'); expect(UrlStateSelectors.getAssemblyViewIsOpen(getState())).toBeTrue(); expect(UrlStateSelectors.getAssemblyViewNativeSymbol(getState())).toEqual( nativeSymbolInfoD @@ -242,7 +243,7 @@ describe('bottom box', function () { // initialized but closed. The assembly view should show one of the two // native symbols. expect(UrlStateSelectors.getIsBottomBoxOpen(getState())).toBeTrue(); - expect(UrlStateSelectors.getSourceViewFile(getState())).toBe('cde.cpp'); + expect(ProfileSelectors.getSourceViewFile(getState())).toBe('cde.cpp'); expect(UrlStateSelectors.getAssemblyViewIsOpen(getState())).toBeFalse(); expect( ensureExists(UrlStateSelectors.getAssemblyViewNativeSymbol(getState())) diff --git a/src/test/store/js-tracer.test.ts b/src/test/store/js-tracer.test.ts index 02f6a0bf51..6fd44b9f8b 100644 --- a/src/test/store/js-tracer.test.ts +++ b/src/test/store/js-tracer.test.ts @@ -12,7 +12,7 @@ import { } from '../../profile-logic/js-tracer'; import { getEmptyProfile } from '../../profile-logic/data-structures'; import { StringTable } from '../../utils/string-table'; -import { formatTree } from '../fixtures/utils'; +import { formatTree, addSourceToTable } from '../fixtures/utils'; import { getProfileFromTextSamples, getProfileWithJsTracerEvents, @@ -137,7 +137,8 @@ describe('convertJsTracerToThread', function () { existingThread, jsTracer, categories, - stringTable + stringTable, + profile.shared.sources ), ]; const { getState } = storeWithProfile(profile); @@ -354,8 +355,10 @@ describe('selectors/getJsTracerTiming', function () { const fooColumn = 5; thread.funcTable.lineNumber[foo] = fooLine; thread.funcTable.columnNumber[foo] = fooColumn; - thread.funcTable.fileName[foo] = stringTable.indexForString( - 'https://mozilla.org' + const fooUrlIndex = stringTable.indexForString('https://mozilla.org'); + thread.funcTable.source[foo] = addSourceToTable( + profile.shared.sources, + fooUrlIndex ); const bar = funcNamesDict['Bar.js']; @@ -363,16 +366,20 @@ describe('selectors/getJsTracerTiming', function () { const barColumn = 11; thread.funcTable.lineNumber[bar] = barLine; thread.funcTable.columnNumber[bar] = barColumn; - thread.funcTable.fileName[bar] = stringTable.indexForString( - 'https://mozilla.org' + const barUrlIndex = stringTable.indexForString('https://mozilla.org'); + thread.funcTable.source[bar] = addSourceToTable( + profile.shared.sources, + barUrlIndex ); const baz = funcNamesDict['Baz.js']; // Use bar's line and column information. thread.funcTable.lineNumber[baz] = barLine; thread.funcTable.columnNumber[baz] = barColumn; - thread.funcTable.fileName[baz] = stringTable.indexForString( - 'https://mozilla.org' + const bazUrlIndex = stringTable.indexForString('https://mozilla.org'); + thread.funcTable.source[baz] = addSourceToTable( + profile.shared.sources, + bazUrlIndex ); // Manually update the JS tracer events to point to the right column numbers. diff --git a/src/test/store/publish.test.ts b/src/test/store/publish.test.ts index ded67707a2..1b9f9f5c74 100644 --- a/src/test/store/publish.test.ts +++ b/src/test/store/publish.test.ts @@ -5,7 +5,7 @@ import { attemptToPublish, resetUploadState, - toggleCheckedSharingOptions, + updateSharingOption, revertToPrePublishedState, } from '../../actions/publish'; import { changeSelectedTab } from '../../actions/app'; @@ -127,8 +127,8 @@ describe('getCheckedSharingOptions', function () { }); }); - describe('toggleCheckedSharingOptions', function () { - it('can toggle options', function () { + describe('updateSharingOption', function () { + it('can update options', function () { const { profile } = getProfileFromTextSamples('A'); // This will cause the profile to be sanitized by default when uploading. profile.meta.updateChannel = 'release'; @@ -138,13 +138,13 @@ describe('getCheckedSharingOptions', function () { includeHiddenThreads: false, }); - dispatch(toggleCheckedSharingOptions('includeHiddenThreads')); + dispatch(updateSharingOption('includeHiddenThreads', true)); expect(getCheckedSharingOptions(getState())).toMatchObject({ includeHiddenThreads: true, }); - dispatch(toggleCheckedSharingOptions('includeHiddenThreads')); + dispatch(updateSharingOption('includeHiddenThreads', false)); expect(getCheckedSharingOptions(getState())).toMatchObject({ includeHiddenThreads: false, @@ -160,7 +160,7 @@ describe('getRemoveProfileInformation', function () { expect(getHasPreferenceMarkers(getState())).toEqual(false); // Setting includePreferenceValues option to false - dispatch(toggleCheckedSharingOptions('includePreferenceValues')); + dispatch(updateSharingOption('includePreferenceValues', false)); expect( getCheckedSharingOptions(getState()).includePreferenceValues ).toEqual(false); @@ -202,8 +202,8 @@ describe('getRemoveProfileInformation', function () { ' - show [thread Thread <3>]', ]); - // Toggle the preference to remove hidden tracks - dispatch(toggleCheckedSharingOptions('includeHiddenThreads')); + // Change the preference to remove hidden tracks + dispatch(updateSharingOption('includeHiddenThreads', false)); // Note: Jest doesn't check Set values with toMatchObject, so we're checking the // properties individually. See https://github.com/facebook/jest/issues/11250 expect( @@ -474,10 +474,7 @@ describe('attemptToPublish', function () { expect(getSelectedTab(getState())).toEqual(originalTab); // Ensure we are sanitizing something. - const sharingOptions = getCheckedSharingOptions(getState()); - if (sharingOptions.includeUrls) { - dispatch(toggleCheckedSharingOptions('includeUrls')); - } + dispatch(updateSharingOption('includeUrls', false)); // Now upload. const publishAttempt = dispatch(attemptToPublish()); @@ -776,7 +773,7 @@ describe('attemptToPublish', function () { abortFunction(); // Then we check new options to sanitize the profile, and attempt a new publish. - dispatch(toggleCheckedSharingOptions('includeFullTimeRange')); + dispatch(updateSharingOption('includeFullTimeRange', false)); expect(getRemoveProfileInformation(getState())).toMatchObject({ shouldFilterToCommittedRange: { start: 1, end: 4 }, }); diff --git a/src/test/store/symbolication.test.ts b/src/test/store/symbolication.test.ts index 384377341f..8f7065ec8b 100644 --- a/src/test/store/symbolication.test.ts +++ b/src/test/store/symbolication.test.ts @@ -276,8 +276,17 @@ describe('doSymbolicateProfile', function () { const thread = getThread(getState()); const { frameTable, funcTable, stringTable } = thread; + const sources = ProfileViewSelectors.getSourceTable(getState()); expect(funcTable.length).toBeGreaterThanOrEqual(4); + // Helper function to get filename from source index + const getFileName = (funcIndex: number): string | null => { + const sourceIndex = funcTable.source[funcIndex]; + if (sourceIndex === null) return null; + const urlIndex = sources.filename[sourceIndex]; + return stringTable.getString(urlIndex); + }; + const [ firstSymbolFuncIndex, secondSymbolFuncIndex, @@ -315,27 +324,19 @@ describe('doSymbolicateProfile', function () { last symbol (first_and_last.cpp)`); // The first and last symbol function should have the filename first_and_last.cpp. - expect(funcTable.fileName[firstSymbolFuncIndex]).toBe( - funcTable.fileName[lastSymbolFuncIndex] + expect(getFileName(firstSymbolFuncIndex)).toBe( + getFileName(lastSymbolFuncIndex) ); - let fileNameStringIndex = funcTable.fileName[firstSymbolFuncIndex]; - expect(fileNameStringIndex).not.toBeNull(); - let fileName = - fileNameStringIndex !== null - ? stringTable.getString(fileNameStringIndex) - : ''; + let fileName = getFileName(firstSymbolFuncIndex); + expect(fileName).not.toBeNull(); expect(fileName).toBe('first_and_last.cpp'); // The second and third symbol function should have the filename second_and_third.rs. - expect(funcTable.fileName[secondSymbolFuncIndex]).toBe( - funcTable.fileName[thirdSymbolFuncIndex] + expect(getFileName(secondSymbolFuncIndex)).toBe( + getFileName(thirdSymbolFuncIndex) ); - fileNameStringIndex = funcTable.fileName[secondSymbolFuncIndex]; - expect(fileNameStringIndex).not.toBeNull(); - fileName = - fileNameStringIndex !== null - ? stringTable.getString(fileNameStringIndex) - : ''; + fileName = getFileName(secondSymbolFuncIndex); + expect(fileName).not.toBeNull(); expect(fileName).toBe('second_and_third.rs'); // Check line numbers. diff --git a/src/test/store/transforms.test.ts b/src/test/store/transforms.test.ts index e386878699..c646b311ec 100644 --- a/src/test/store/transforms.test.ts +++ b/src/test/store/transforms.test.ts @@ -1223,11 +1223,13 @@ describe('"collapse-direct-recursion" transform', function () { const { stackTable, frameTable, funcTable, samples, stringTable } = filteredThread; const fileStringIndex = stringTable.indexForString('b'); + const fileSourceIndex = + filteredThread.sources.filename.indexOf(fileStringIndex); const stackLineInfo = getStackLineInfo( stackTable, frameTable, funcTable, - fileStringIndex + fileSourceIndex ); const lineTimings = getLineTimings(stackLineInfo, samples); @@ -1405,11 +1407,13 @@ describe('"collapse-recursion" transform', function () { const { stackTable, frameTable, funcTable, samples, stringTable } = filteredThread; const fileStringIndex = stringTable.indexForString('b'); + const fileSourceIndex = + filteredThread.sources.filename.indexOf(fileStringIndex); const stackLineInfo = getStackLineInfo( stackTable, frameTable, funcTable, - fileStringIndex + fileSourceIndex ); const lineTimings = getLineTimings(stackLineInfo, samples); @@ -1516,11 +1520,13 @@ describe('"collapse-recursion" transform', function () { const { stackTable, frameTable, funcTable, samples, stringTable } = filteredThread; const fileStringIndex = stringTable.indexForString('b'); + const fileSourceIndex = + filteredThread.sources.filename.indexOf(fileStringIndex); const stackLineInfo = getStackLineInfo( stackTable, frameTable, funcTable, - fileStringIndex + fileSourceIndex ); const lineTimings = getLineTimings(stackLineInfo, samples); @@ -1650,11 +1656,13 @@ describe('"collapse-recursion" transform', function () { const { stackTable, frameTable, funcTable, samples, stringTable } = filteredThread; const fileStringIndex = stringTable.indexForString('b'); + const fileSourceIndex = + filteredThread.sources.filename.indexOf(fileStringIndex); const stackLineInfo = getStackLineInfo( stackTable, frameTable, funcTable, - fileStringIndex + fileSourceIndex ); const lineTimings = getLineTimings(stackLineInfo, samples); diff --git a/src/test/unit/__snapshots__/profile-conversion.test.ts.snap b/src/test/unit/__snapshots__/profile-conversion.test.ts.snap index 51aeb0ab04..aa0f53fbe6 100644 --- a/src/test/unit/__snapshots__/profile-conversion.test.ts.snap +++ b/src/test/unit/__snapshots__/profile-conversion.test.ts.snap @@ -573,7 +573,7 @@ Object { "oscpu": undefined, "physicalCPUs": undefined, "platform": undefined, - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "ART Trace (Android)", "sampleUnits": undefined, @@ -586,7 +586,7 @@ Object { "symbolicated": true, "toolkit": undefined, "updateChannel": undefined, - "version": 31, + "version": 32, "visualMetrics": undefined, }, "pages": Array [], @@ -594,6 +594,11 @@ Object { "profilerOverhead": Array [], "profilingLog": Object {}, "shared": Object { + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stringArray": Array [ "com.android.internal.os.ZygoteInit.main", "com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run", @@ -16851,1358 +16856,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -24964,6 +23617,1358 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -33710,17 +33715,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -33777,6 +33771,17 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -34521,18 +34526,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -34594,6 +34587,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -35307,14 +35312,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -35356,6 +35353,14 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -35495,12 +35500,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -35532,6 +35531,12 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -35723,18 +35728,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -35796,6 +35789,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -35999,18 +36004,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -36072,6 +36065,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -36721,59 +36726,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -37040,119 +36992,172 @@ Object { -1, -1, ], - }, - "isMainThread": false, - "markers": Object { - "category": Array [], - "data": Array [], - "endTime": Array [], - "length": 0, - "name": Array [], - "phase": Array [], - "startTime": Array [], - }, - "name": "GleanAPIPool", - "nativeSymbols": Object { - "address": Array [], - "functionSize": Array [], - "length": 0, - "libIndex": Array [], - "name": Array [], - }, - "pausedRanges": Array [], - "pid": "21491", - "processName": "", - "processShutdownTime": null, - "processStartupTime": 0, - "processType": undefined, - "registerTime": 114.04, - "resourceTable": Object { - "host": Array [], - "length": 0, - "lib": Array [], - "name": Array [], - "type": Array [], - }, - "samples": Object { - "length": 1102, - "responsiveness": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], + }, + "isMainThread": false, + "markers": Object { + "category": Array [], + "data": Array [], + "endTime": Array [], + "length": 0, + "name": Array [], + "phase": Array [], + "startTime": Array [], + }, + "name": "GleanAPIPool", + "nativeSymbols": Object { + "address": Array [], + "functionSize": Array [], + "length": 0, + "libIndex": Array [], + "name": Array [], + }, + "pausedRanges": Array [], + "pid": "21491", + "processName": "", + "processShutdownTime": null, + "processStartupTime": 0, + "processType": undefined, + "registerTime": 114.04, + "resourceTable": Object { + "host": Array [], + "length": 0, + "lib": Array [], + "name": Array [], + "type": Array [], + }, + "samples": Object { + "length": 1102, + "responsiveness": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, null, null, null, @@ -41272,72 +41277,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -41669,42 +41608,108 @@ Object { -1, -1, ], - }, - "isMainThread": false, - "markers": Object { - "category": Array [], - "data": Array [], - "endTime": Array [], - "length": 0, - "name": Array [], - "phase": Array [], - "startTime": Array [], - }, - "name": "DefaultDispatcher-worker-1", - "nativeSymbols": Object { - "address": Array [], - "functionSize": Array [], - "length": 0, - "libIndex": Array [], - "name": Array [], - }, - "pausedRanges": Array [], - "pid": "21491", - "processName": "", - "processShutdownTime": null, - "processStartupTime": 0, - "processType": undefined, - "registerTime": 114.075, - "resourceTable": Object { - "host": Array [], - "length": 0, - "lib": Array [], - "name": Array [], - "type": Array [], - }, - "samples": Object { - "length": 472, - "responsiveness": Array [ + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], + }, + "isMainThread": false, + "markers": Object { + "category": Array [], + "data": Array [], + "endTime": Array [], + "length": 0, + "name": Array [], + "phase": Array [], + "startTime": Array [], + }, + "name": "DefaultDispatcher-worker-1", + "nativeSymbols": Object { + "address": Array [], + "functionSize": Array [], + "length": 0, + "libIndex": Array [], + "name": Array [], + }, + "pausedRanges": Array [], + "pid": "21491", + "processName": "", + "processShutdownTime": null, + "processStartupTime": 0, + "processType": undefined, + "registerTime": 114.075, + "resourceTable": Object { + "host": Array [], + "length": 0, + "lib": Array [], + "name": Array [], + "type": Array [], + }, + "samples": Object { + "length": 472, + "responsiveness": Array [ null, null, null, @@ -44181,89 +44186,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -44680,6 +44602,89 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -46655,37 +46660,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -46842,6 +46816,37 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -48677,34 +48682,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -48846,6 +48823,34 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -51459,12 +51464,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -51496,6 +51495,12 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -51626,11 +51631,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - ], "isJS": Array [ false, false, @@ -51657,6 +51657,11 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -52295,60 +52300,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -52620,42 +52571,96 @@ Object { -1, -1, ], - }, - "isMainThread": false, - "markers": Object { - "category": Array [], - "data": Array [], - "endTime": Array [], - "length": 0, - "name": Array [], - "phase": Array [], - "startTime": Array [], - }, - "name": "DefaultDispatcher-worker-4", - "nativeSymbols": Object { - "address": Array [], - "functionSize": Array [], - "length": 0, - "libIndex": Array [], - "name": Array [], - }, - "pausedRanges": Array [], - "pid": "21491", - "processName": "", - "processShutdownTime": null, - "processStartupTime": 0, - "processType": undefined, - "registerTime": 175.88, - "resourceTable": Object { - "host": Array [], - "length": 0, - "lib": Array [], - "name": Array [], - "type": Array [], - }, - "samples": Object { - "length": 460, - "responsiveness": Array [ + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], + }, + "isMainThread": false, + "markers": Object { + "category": Array [], + "data": Array [], + "endTime": Array [], + "length": 0, + "name": Array [], + "phase": Array [], + "startTime": Array [], + }, + "name": "DefaultDispatcher-worker-4", + "nativeSymbols": Object { + "address": Array [], + "functionSize": Array [], + "length": 0, + "libIndex": Array [], + "name": Array [], + }, + "pausedRanges": Array [], + "pid": "21491", + "processName": "", + "processShutdownTime": null, + "processStartupTime": 0, + "processType": undefined, + "registerTime": 175.88, + "resourceTable": Object { + "host": Array [], + "length": 0, + "lib": Array [], + "name": Array [], + "type": Array [], + }, + "samples": Object { + "length": 460, + "responsiveness": Array [ null, null, null, @@ -55283,105 +55288,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -55878,211 +55784,310 @@ Object { -1, -1, ], - }, - "isMainThread": false, - "markers": Object { - "category": Array [], - "data": Array [], - "endTime": Array [], - "length": 0, - "name": Array [], - "phase": Array [], - "startTime": Array [], - }, - "name": "DefaultDispatcher-worker-5", - "nativeSymbols": Object { - "address": Array [], - "functionSize": Array [], - "length": 0, - "libIndex": Array [], - "name": Array [], - }, - "pausedRanges": Array [], - "pid": "21491", - "processName": "", - "processShutdownTime": null, - "processStartupTime": 0, - "processType": undefined, - "registerTime": 175.892, - "resourceTable": Object { - "host": Array [], - "length": 0, - "lib": Array [], - "name": Array [], - "type": Array [], - }, - "samples": Object { - "length": 459, - "responsiveness": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], + }, + "isMainThread": false, + "markers": Object { + "category": Array [], + "data": Array [], + "endTime": Array [], + "length": 0, + "name": Array [], + "phase": Array [], + "startTime": Array [], + }, + "name": "DefaultDispatcher-worker-5", + "nativeSymbols": Object { + "address": Array [], + "functionSize": Array [], + "length": 0, + "libIndex": Array [], + "name": Array [], + }, + "pausedRanges": Array [], + "pid": "21491", + "processName": "", + "processShutdownTime": null, + "processStartupTime": 0, + "processType": undefined, + "registerTime": 175.892, + "resourceTable": Object { + "host": Array [], + "length": 0, + "lib": Array [], + "name": Array [], + "type": Array [], + }, + "samples": Object { + "length": 459, + "responsiveness": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, null, null, null, @@ -58880,128 +58885,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -59613,6 +59496,128 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -63713,119 +63718,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -64392,6 +64284,119 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -67202,15 +67207,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -67257,6 +67253,15 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -69809,12 +69814,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -69846,6 +69845,12 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -70046,18 +70051,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -70119,6 +70112,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -70264,12 +70269,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -70301,6 +70300,12 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -70502,19 +70507,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -70581,6 +70573,19 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -71048,40 +71053,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -71253,6 +71224,40 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -72024,66 +72029,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -72385,6 +72330,66 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -72695,14 +72700,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -72744,6 +72741,14 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -72939,18 +72944,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -73012,6 +73005,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -74041,97 +74046,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -74588,42 +74502,133 @@ Object { -1, -1, ], - }, - "isMainThread": false, - "markers": Object { - "category": Array [], - "data": Array [], - "endTime": Array [], - "length": 0, - "name": Array [], - "phase": Array [], - "startTime": Array [], - }, - "name": "pool-12-thread-1", - "nativeSymbols": Object { - "address": Array [], - "functionSize": Array [], - "length": 0, - "libIndex": Array [], - "name": Array [], - }, - "pausedRanges": Array [], - "pid": "21491", - "processName": "", - "processShutdownTime": null, - "processStartupTime": 0, - "processType": undefined, - "registerTime": 856.46, - "resourceTable": Object { - "host": Array [], - "length": 0, - "lib": Array [], - "name": Array [], - "type": Array [], - }, - "samples": Object { - "length": 60, - "responsiveness": Array [ + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], + }, + "isMainThread": false, + "markers": Object { + "category": Array [], + "data": Array [], + "endTime": Array [], + "length": 0, + "name": Array [], + "phase": Array [], + "startTime": Array [], + }, + "name": "pool-12-thread-1", + "nativeSymbols": Object { + "address": Array [], + "functionSize": Array [], + "length": 0, + "libIndex": Array [], + "name": Array [], + }, + "pausedRanges": Array [], + "pid": "21491", + "processName": "", + "processShutdownTime": null, + "processStartupTime": 0, + "processType": undefined, + "registerTime": 856.46, + "resourceTable": Object { + "host": Array [], + "length": 0, + "lib": Array [], + "name": Array [], + "type": Array [], + }, + "samples": Object { + "length": 60, + "responsiveness": Array [ null, null, null, @@ -76022,72 +76027,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -76419,77 +76358,143 @@ Object { -1, -1, ], - }, - "isMainThread": false, - "markers": Object { - "category": Array [], - "data": Array [], - "endTime": Array [], - "length": 0, - "name": Array [], - "phase": Array [], - "startTime": Array [], - }, - "name": "DefaultDispatcher-worker-7", - "nativeSymbols": Object { - "address": Array [], - "functionSize": Array [], - "length": 0, - "libIndex": Array [], - "name": Array [], - }, - "pausedRanges": Array [], - "pid": "21491", - "processName": "", - "processShutdownTime": null, - "processStartupTime": 0, - "processType": undefined, - "registerTime": 887.128, - "resourceTable": Object { - "host": Array [], - "length": 0, - "lib": Array [], - "name": Array [], - "type": Array [], - }, - "samples": Object { - "length": 332, - "responsiveness": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], + }, + "isMainThread": false, + "markers": Object { + "category": Array [], + "data": Array [], + "endTime": Array [], + "length": 0, + "name": Array [], + "phase": Array [], + "startTime": Array [], + }, + "name": "DefaultDispatcher-worker-7", + "nativeSymbols": Object { + "address": Array [], + "functionSize": Array [], + "length": 0, + "libIndex": Array [], + "name": Array [], + }, + "pausedRanges": Array [], + "pid": "21491", + "processName": "", + "processShutdownTime": null, + "processStartupTime": 0, + "processType": undefined, + "registerTime": 887.128, + "resourceTable": Object { + "host": Array [], + "length": 0, + "lib": Array [], + "name": Array [], + "type": Array [], + }, + "samples": Object { + "length": 332, + "responsiveness": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, null, null, null, @@ -77870,28 +77875,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -78003,6 +77986,28 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -79296,23 +79301,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -79399,6 +79387,23 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -80467,68 +80472,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -80840,6 +80783,68 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -82493,23 +82498,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -82596,6 +82584,23 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -82807,17 +82812,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -82874,6 +82868,17 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -83028,13 +83033,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -83071,6 +83069,13 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -83214,13 +83219,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -83257,6 +83255,13 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -83400,13 +83405,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -83443,6 +83441,13 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -83566,11 +83571,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - ], "isJS": Array [ false, false, @@ -83597,6 +83597,11 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -84138,52 +84143,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -84415,6 +84374,52 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -84772,21 +84777,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -84863,6 +84853,21 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -85523,7 +85528,7 @@ Object { "oscpu": undefined, "physicalCPUs": undefined, "platform": undefined, - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "ART Trace (Android)", "sampleUnits": undefined, @@ -85536,7 +85541,7 @@ Object { "symbolicated": true, "toolkit": undefined, "updateChannel": undefined, - "version": 31, + "version": 32, "visualMetrics": undefined, }, "pages": Array [], @@ -85544,6 +85549,11 @@ Object { "profilerOverhead": Array [], "profilingLog": Object {}, "shared": Object { + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stringArray": Array [ "com.android.internal.os.ZygoteInit.main", "com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run", @@ -119678,2848 +119688,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -136731,6 +133899,2848 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -160479,12 +160489,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -160501,375 +160505,381 @@ Object { "name": Array [ 2840, 2841, - 2842, - 2843, - ], - "relevantForJS": Array [ - false, - false, - false, - false, - ], - "resource": Array [ - -1, - -1, - -1, - -1, - ], - }, - "isMainThread": false, - "markers": Object { - "category": Array [], - "data": Array [], - "endTime": Array [], - "length": 0, - "name": Array [], - "phase": Array [], - "startTime": Array [], - }, - "name": "ReferenceQueueDaemon", - "nativeSymbols": Object { - "address": Array [], - "functionSize": Array [], - "length": 0, - "libIndex": Array [], - "name": Array [], - }, - "pausedRanges": Array [], - "pid": "15983", - "processName": "", - "processShutdownTime": null, - "processStartupTime": 0, - "processType": undefined, - "registerTime": 127.627, - "resourceTable": Object { - "host": Array [], - "length": 0, - "lib": Array [], - "name": Array [], - "type": Array [], - }, - "samples": Object { - "length": 1, - "responsiveness": Array [ - null, - ], - "stack": Array [ - 3, - ], - "timeDeltas": Array [ - 127.627, - ], - "weight": null, - "weightType": "samples", - }, - "stackTable": Object { - "frame": Array [ - 0, - 1, - 2, - 3, - ], - "length": 4, - "prefix": Array [ - null, - 0, - 1, - 2, - ], - }, - "tid": 15996, - "unregisterTime": null, - }, - Object { - "eTLD+1": undefined, - "frameTable": Object { - "address": Array [ - -1, - -1, - -1, - -1, - -1, - ], - "category": Array [ - 4, - 4, - 4, - 4, - 2, - ], - "column": Array [ - null, - null, - null, - null, - null, - ], - "func": Array [ - 0, - 1, - 2, - 3, - 4, - ], - "inlineDepth": Array [ - 0, - 0, - 0, - 0, - 0, - ], - "innerWindowID": Array [ - 0, - 0, - 0, - 0, - 0, - ], - "length": 5, - "line": Array [ - null, - null, - null, - null, - null, - ], - "nativeSymbol": Array [ - null, - null, - null, - null, - null, - ], - "subcategory": Array [ - 0, - 0, - 0, - 0, - 0, - ], - }, - "funcTable": Object { - "columnNumber": Array [ - null, - null, - null, - null, - null, - ], - "fileName": Array [ - null, - null, - null, - null, - null, - ], - "isJS": Array [ - false, - false, - false, - false, - false, - ], - "length": 5, - "lineNumber": Array [ - null, - null, - null, - null, - null, - ], - "name": Array [ - 2840, - 2841, - 2844, - 2845, - 2843, + 2842, + 2843, + ], + "relevantForJS": Array [ + false, + false, + false, + false, + ], + "resource": Array [ + -1, + -1, + -1, + -1, + ], + "source": Array [ + null, + null, + null, + null, + ], + }, + "isMainThread": false, + "markers": Object { + "category": Array [], + "data": Array [], + "endTime": Array [], + "length": 0, + "name": Array [], + "phase": Array [], + "startTime": Array [], + }, + "name": "ReferenceQueueDaemon", + "nativeSymbols": Object { + "address": Array [], + "functionSize": Array [], + "length": 0, + "libIndex": Array [], + "name": Array [], + }, + "pausedRanges": Array [], + "pid": "15983", + "processName": "", + "processShutdownTime": null, + "processStartupTime": 0, + "processType": undefined, + "registerTime": 127.627, + "resourceTable": Object { + "host": Array [], + "length": 0, + "lib": Array [], + "name": Array [], + "type": Array [], + }, + "samples": Object { + "length": 1, + "responsiveness": Array [ + null, + ], + "stack": Array [ + 3, + ], + "timeDeltas": Array [ + 127.627, + ], + "weight": null, + "weightType": "samples", + }, + "stackTable": Object { + "frame": Array [ + 0, + 1, + 2, + 3, + ], + "length": 4, + "prefix": Array [ + null, + 0, + 1, + 2, + ], + }, + "tid": 15996, + "unregisterTime": null, + }, + Object { + "eTLD+1": undefined, + "frameTable": Object { + "address": Array [ + -1, + -1, + -1, + -1, + -1, + ], + "category": Array [ + 4, + 4, + 4, + 4, + 2, + ], + "column": Array [ + null, + null, + null, + null, + null, + ], + "func": Array [ + 0, + 1, + 2, + 3, + 4, + ], + "inlineDepth": Array [ + 0, + 0, + 0, + 0, + 0, + ], + "innerWindowID": Array [ + 0, + 0, + 0, + 0, + 0, + ], + "length": 5, + "line": Array [ + null, + null, + null, + null, + null, + ], + "nativeSymbol": Array [ + null, + null, + null, + null, + null, + ], + "subcategory": Array [ + 0, + 0, + 0, + 0, + 0, + ], + }, + "funcTable": Object { + "columnNumber": Array [ + null, + null, + null, + null, + null, + ], + "isJS": Array [ + false, + false, + false, + false, + false, + ], + "length": 5, + "lineNumber": Array [ + null, + null, + null, + null, + null, + ], + "name": Array [ + 2840, + 2841, + 2844, + 2845, + 2843, + ], + "relevantForJS": Array [ + false, + false, + false, + false, + false, + ], + "resource": Array [ + -1, + -1, + -1, + -1, + -1, + ], + "source": Array [ + null, + null, + null, + null, + null, + ], + }, + "isMainThread": false, + "markers": Object { + "category": Array [], + "data": Array [], + "endTime": Array [], + "length": 0, + "name": Array [], + "phase": Array [], + "startTime": Array [], + }, + "name": "FinalizerWatchdogDaemon", + "nativeSymbols": Object { + "address": Array [], + "functionSize": Array [], + "length": 0, + "libIndex": Array [], + "name": Array [], + }, + "pausedRanges": Array [], + "pid": "15983", + "processName": "", + "processShutdownTime": null, + "processStartupTime": 0, + "processType": undefined, + "registerTime": 127.777, + "resourceTable": Object { + "host": Array [], + "length": 0, + "lib": Array [], + "name": Array [], + "type": Array [], + }, + "samples": Object { + "length": 1, + "responsiveness": Array [ + null, + ], + "stack": Array [ + 4, + ], + "timeDeltas": Array [ + 127.777, + ], + "weight": null, + "weightType": "samples", + }, + "stackTable": Object { + "frame": Array [ + 0, + 1, + 2, + 3, + 4, + ], + "length": 5, + "prefix": Array [ + null, + 0, + 1, + 2, + 3, + ], + }, + "tid": 15998, + "unregisterTime": null, + }, + Object { + "eTLD+1": undefined, + "frameTable": Object { + "address": Array [ + -1, + -1, + -1, + -1, + ], + "category": Array [ + 4, + 4, + 4, + 1, + ], + "column": Array [ + null, + null, + null, + null, + ], + "func": Array [ + 0, + 1, + 2, + 3, + ], + "inlineDepth": Array [ + 0, + 0, + 0, + 0, + ], + "innerWindowID": Array [ + 0, + 0, + 0, + 0, + ], + "length": 4, + "line": Array [ + null, + null, + null, + null, + ], + "nativeSymbol": Array [ + null, + null, + null, + null, + ], + "subcategory": Array [ + 0, + 0, + 0, + 0, + ], + }, + "funcTable": Object { + "columnNumber": Array [ + null, + null, + null, + null, + ], + "isJS": Array [ + false, + false, + false, + false, + ], + "length": 4, + "lineNumber": Array [ + null, + null, + null, + null, + ], + "name": Array [ + 2840, + 2841, + 2846, + 2847, ], "relevantForJS": Array [ false, false, false, false, - false, ], "resource": Array [ -1, -1, -1, -1, - -1, - ], - }, - "isMainThread": false, - "markers": Object { - "category": Array [], - "data": Array [], - "endTime": Array [], - "length": 0, - "name": Array [], - "phase": Array [], - "startTime": Array [], - }, - "name": "FinalizerWatchdogDaemon", - "nativeSymbols": Object { - "address": Array [], - "functionSize": Array [], - "length": 0, - "libIndex": Array [], - "name": Array [], - }, - "pausedRanges": Array [], - "pid": "15983", - "processName": "", - "processShutdownTime": null, - "processStartupTime": 0, - "processType": undefined, - "registerTime": 127.777, - "resourceTable": Object { - "host": Array [], - "length": 0, - "lib": Array [], - "name": Array [], - "type": Array [], - }, - "samples": Object { - "length": 1, - "responsiveness": Array [ - null, - ], - "stack": Array [ - 4, - ], - "timeDeltas": Array [ - 127.777, - ], - "weight": null, - "weightType": "samples", - }, - "stackTable": Object { - "frame": Array [ - 0, - 1, - 2, - 3, - 4, - ], - "length": 5, - "prefix": Array [ - null, - 0, - 1, - 2, - 3, - ], - }, - "tid": 15998, - "unregisterTime": null, - }, - Object { - "eTLD+1": undefined, - "frameTable": Object { - "address": Array [ - -1, - -1, - -1, - -1, ], - "category": Array [ - 4, - 4, - 4, - 1, - ], - "column": Array [ - null, - null, - null, - null, - ], - "func": Array [ - 0, - 1, - 2, - 3, - ], - "inlineDepth": Array [ - 0, - 0, - 0, - 0, - ], - "innerWindowID": Array [ - 0, - 0, - 0, - 0, - ], - "length": 4, - "line": Array [ + "source": Array [ null, null, null, null, ], - "nativeSymbol": Array [ - null, - null, - null, - null, - ], - "subcategory": Array [ - 0, - 0, - 0, - 0, - ], - }, - "funcTable": Object { - "columnNumber": Array [ - null, - null, - null, - null, - ], - "fileName": Array [ - null, - null, - null, - null, - ], - "isJS": Array [ - false, - false, - false, - false, - ], - "length": 4, - "lineNumber": Array [ - null, - null, - null, - null, - ], - "name": Array [ - 2840, - 2841, - 2846, - 2847, - ], - "relevantForJS": Array [ - false, - false, - false, - false, - ], - "resource": Array [ - -1, - -1, - -1, - -1, - ], }, "isMainThread": false, "markers": Object { @@ -161029,13 +161039,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -161072,6 +161075,13 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -161269,18 +161279,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -161342,6 +161340,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -161485,12 +161495,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -161522,6 +161526,12 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -161713,18 +161723,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -161786,6 +161784,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -162207,38 +162217,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -162400,6 +162378,38 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -174857,287 +174867,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -176544,6 +176273,287 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -187861,121 +187871,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -188552,6 +188447,121 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -198266,11 +198276,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - ], "isJS": Array [ false, false, @@ -198297,6 +198302,11 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -198408,10 +198418,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - ], "isJS": Array [ false, false, @@ -198433,6 +198439,10 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -198560,12 +198570,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -198597,6 +198601,12 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -198788,18 +198798,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -198861,6 +198859,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -199064,18 +199074,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -199137,6 +199135,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -199378,20 +199388,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -199463,6 +199459,20 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -216483,12 +216493,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -216520,6 +216524,12 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -216711,18 +216721,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -216784,6 +216782,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -216967,16 +216977,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -217028,6 +217028,16 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -218359,124 +218369,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -219068,6 +218960,124 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -228929,16 +228939,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -228990,6 +228990,16 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -229169,16 +229179,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -229230,6 +229230,16 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -229409,16 +229419,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -229470,6 +229470,16 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -229649,16 +229659,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -229710,6 +229710,16 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -229849,12 +229859,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -229886,6 +229890,12 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -230037,14 +230047,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -230086,6 +230088,14 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -230281,18 +230291,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -230354,6 +230352,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -230805,7 +230815,183 @@ Object { null, null, ], - "fileName": Array [ + "isJS": Array [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + ], + "length": 33, + "lineNumber": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], + "name": Array [ + 2840, + 2850, + 2851, + 2852, + 2859, + 3150, + 2879, + 2856, + 2857, + 2843, + 2860, + 3151, + 2862, + 3152, + 3153, + 3154, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 599, + 600, + 601, + 2956, + 2957, + 2958, + 3155, + 3156, + 1158, + ], + "relevantForJS": Array [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + ], + "resource": Array [ + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + ], + "source": Array [ null, null, null, @@ -230840,182 +231026,6 @@ Object { null, null, ], - "isJS": Array [ - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - ], - "length": 33, - "lineNumber": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], - "name": Array [ - 2840, - 2850, - 2851, - 2852, - 2859, - 3150, - 2879, - 2856, - 2857, - 2843, - 2860, - 3151, - 2862, - 3152, - 3153, - 3154, - 53, - 54, - 55, - 56, - 57, - 58, - 59, - 60, - 599, - 600, - 601, - 2956, - 2957, - 2958, - 3155, - 3156, - 1158, - ], - "relevantForJS": Array [ - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - ], - "resource": Array [ - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - ], }, "isMainThread": false, "markers": Object { @@ -237902,18 +237912,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -237975,6 +237973,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -238178,18 +238188,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -238251,6 +238249,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -238454,18 +238464,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -238527,6 +238525,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -238730,18 +238740,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -238803,6 +238801,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -239006,18 +239016,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -239079,6 +239077,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -239282,18 +239292,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -239355,6 +239353,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -241696,221 +241706,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -242987,6 +242782,221 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -253029,197 +253039,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -254176,6 +253995,197 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -264032,189 +264042,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -265131,6 +264958,189 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -273194,18 +273204,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -273267,6 +273265,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -273490,20 +273500,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -273575,6 +273571,20 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -283082,18 +283092,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -283155,6 +283153,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -283358,18 +283368,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -283431,6 +283429,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -284242,77 +284252,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -284669,6 +284608,77 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -288748,65 +288758,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -289103,6 +289054,65 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -294377,154 +294387,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -295266,6 +295128,154 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -303597,62 +303607,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -303934,6 +303888,62 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -319161,102 +319171,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -319738,6 +319652,102 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -320823,71 +320833,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -321214,6 +321159,71 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -323210,171 +323220,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -324201,6 +324046,171 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -329500,147 +329510,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -330347,6 +330216,147 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -334170,12 +334180,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -334207,6 +334211,12 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -334341,12 +334351,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -334378,6 +334382,12 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -334629,7 +334639,7 @@ Object { "oscpu": "", "physicalCPUs": 0, "platform": "", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Chrome Trace", "profilingEndTime": 119159778.026, @@ -334639,10 +334649,19 @@ Object { "startTime": 0, "symbolicated": true, "toolkit": "", - "version": 31, + "version": 32, }, "pages": Array [], "shared": Object { + "sources": Object { + "filename": Array [ + 4, + ], + "length": 1, + "uuid": Array [ + null, + ], + }, "stringArray": Array [ "(root)", "e", @@ -334744,13 +334763,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": true, "markers": Object { @@ -339268,13 +339287,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -345546,13 +345565,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -345713,13 +345732,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -345799,13 +345818,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -346163,33 +346182,6 @@ Object { 297, null, ], - "fileName": Array [ - null, - 4, - null, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - null, - null, - null, - 4, - 4, - 4, - 4, - null, - 4, - null, - 4, - 4, - 4, - null, - ], "isJS": Array [ false, true, @@ -346326,6 +346318,33 @@ Object { 0, -1, ], + "source": Array [ + null, + 0, + null, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + null, + null, + null, + 0, + 0, + 0, + 0, + null, + 0, + null, + 0, + 0, + 0, + null, + ], }, "isMainThread": true, "markers": Object { @@ -356907,13 +356926,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -358784,13 +358803,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -364378,13 +364397,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -364464,13 +364483,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -364757,13 +364776,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -365050,13 +365069,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -365343,13 +365362,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -365609,13 +365628,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": true, "markers": Object { @@ -375834,13 +375853,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -383004,7 +383023,7 @@ Object { "oscpu": "", "physicalCPUs": 0, "platform": "", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Chrome Trace", "profilingEndTime": 119159778.026, @@ -383014,10 +383033,19 @@ Object { "startTime": 0, "symbolicated": true, "toolkit": "", - "version": 31, + "version": 32, }, "pages": Array [], "shared": Object { + "sources": Object { + "filename": Array [ + 4, + ], + "length": 1, + "uuid": Array [ + null, + ], + }, "stringArray": Array [ "(root)", "e", @@ -383119,13 +383147,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": true, "markers": Object { @@ -387643,13 +387671,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -393921,13 +393949,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -394088,13 +394116,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -394174,13 +394202,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -394538,33 +394566,6 @@ Object { 297, null, ], - "fileName": Array [ - null, - 4, - null, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - null, - null, - null, - 4, - 4, - 4, - 4, - null, - 4, - null, - 4, - 4, - 4, - null, - ], "isJS": Array [ false, true, @@ -394701,6 +394702,33 @@ Object { 0, -1, ], + "source": Array [ + null, + 0, + null, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + null, + null, + null, + 0, + 0, + 0, + 0, + null, + 0, + null, + 0, + 0, + 0, + null, + ], }, "isMainThread": true, "markers": Object { @@ -405282,13 +405310,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -407159,13 +407187,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -412753,13 +412781,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -412839,13 +412867,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -413132,13 +413160,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -413425,13 +413453,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -413718,13 +413746,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -413984,13 +414012,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": true, "markers": Object { @@ -424209,13 +424237,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -431379,7 +431407,7 @@ Object { "oscpu": "", "physicalCPUs": 0, "platform": "", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Chrome Trace", "profilingEndTime": 66155012.423, @@ -431389,10 +431417,23 @@ Object { "startTime": 0, "symbolicated": true, "toolkit": "", - "version": 31, + "version": 32, }, "pages": Array [], "shared": Object { + "sources": Object { + "filename": Array [ + 5, + 7, + 13, + ], + "length": 3, + "uuid": Array [ + null, + null, + null, + ], + }, "stringArray": Array [ "(root)", "(program)", @@ -431885,49 +431926,6 @@ Object { 25, 31, ], - "fileName": Array [ - null, - null, - 5, - 7, - 5, - null, - 7, - 7, - 7, - 13, - null, - 13, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - null, - null, - null, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 13, - 7, - null, - 13, - 7, - 7, - 7, - 7, - 7, - 7, - ], "isJS": Array [ false, false, @@ -432144,6 +432142,49 @@ Object { 0, 0, ], + "source": Array [ + null, + null, + 0, + 1, + 0, + null, + 1, + 1, + 1, + 2, + null, + 2, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + null, + null, + null, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 1, + null, + 2, + 1, + 1, + 1, + 1, + 1, + 1, + ], }, "isMainThread": true, "markers": Object { @@ -433614,13 +433655,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": true, "markers": Object { @@ -434209,7 +434250,7 @@ Object { "oscpu": "", "physicalCPUs": 0, "platform": "", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Chrome Trace", "sourceURL": "", @@ -434217,10 +434258,15 @@ Object { "startTime": 0, "symbolicated": true, "toolkit": "", - "version": 31, + "version": 32, }, "pages": Array [], "shared": Object { + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stringArray": Array [ "OnLibevent", "ThreadControllerImpl::RunTask", @@ -434249,13 +434295,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -434650,13 +434696,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -434745,13 +434791,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -434840,13 +434886,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -434935,13 +434981,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": true, "markers": Object { @@ -436065,13 +436111,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -436160,13 +436206,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -436300,13 +436346,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -436431,13 +436477,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -436562,13 +436608,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -436693,13 +436739,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -436815,13 +436861,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -436901,13 +436947,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -436987,13 +437033,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -437145,7 +437191,7 @@ Object { "oscpu": "", "physicalCPUs": 0, "platform": "", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Chrome Trace", "profilingEndTime": 355035987.653, @@ -437155,10 +437201,107 @@ Object { "startTime": 1700159839203.051, "symbolicated": true, "toolkit": "", - "version": 31, + "version": 32, }, "pages": Array [], "shared": Object { + "sources": Object { + "filename": Array [ + 3, + 5, + 9, + 13, + 16, + 21, + 29, + 31, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 44, + 47, + 50, + 51, + 52, + 53, + 54, + 56, + 59, + 62, + 69, + 74, + 89, + 90, + 95, + 97, + 101, + 103, + 106, + 110, + 112, + 113, + 116, + 118, + 120, + 126, + 132, + 137, + ], + "length": 45, + "uuid": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], + }, "stringArray": Array [ "(root)", "(program)", @@ -438755,125 +438898,6 @@ Object { 25, null, ], - "fileName": Array [ - null, - null, - 3, - 5, - 5, - null, - 9, - 9, - 9, - 13, - 13, - 16, - 16, - 9, - 9, - 21, - 21, - 21, - 9, - 9, - 9, - 9, - 9, - 29, - 31, - 31, - 9, - 34, - 35, - 36, - 37, - 38, - 39, - 40, - 41, - 42, - 5, - 44, - 42, - 42, - 47, - 47, - 50, - 51, - 52, - 53, - 54, - 56, - 34, - 59, - 59, - 62, - 62, - 34, - 34, - null, - 34, - 69, - 34, - 34, - 34, - 74, - 34, - 34, - 34, - 34, - 69, - 69, - null, - 69, - 56, - 69, - 69, - 56, - 34, - 34, - 89, - 90, - null, - 16, - 16, - 16, - 95, - 95, - 97, - 97, - 42, - 101, - 103, - 103, - 106, - 21, - 21, - 110, - 16, - 112, - 113, - 113, - 116, - 118, - 16, - 120, - 120, - 120, - 42, - 42, - 126, - 126, - null, - 126, - 120, - 132, - 132, - 120, - 120, - 137, - null, - ], "isJS": Array [ false, false, @@ -439470,6 +439494,125 @@ Object { 44, -1, ], + "source": Array [ + null, + null, + 0, + 1, + 1, + null, + 2, + 2, + 2, + 3, + 3, + 4, + 4, + 2, + 2, + 5, + 5, + 5, + 2, + 2, + 2, + 2, + 2, + 6, + 7, + 7, + 2, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 1, + 17, + 16, + 16, + 18, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 8, + 25, + 25, + 26, + 26, + 8, + 8, + null, + 8, + 27, + 8, + 8, + 8, + 28, + 8, + 8, + 8, + 8, + 27, + 27, + null, + 27, + 24, + 27, + 27, + 24, + 8, + 8, + 29, + 30, + null, + 4, + 4, + 4, + 31, + 31, + 32, + 32, + 16, + 33, + 34, + 34, + 35, + 5, + 5, + 36, + 4, + 37, + 38, + 38, + 39, + 40, + 4, + 41, + 41, + 41, + 16, + 16, + 42, + 42, + null, + 42, + 41, + 43, + 43, + 41, + 41, + 44, + null, + ], }, "isMainThread": false, "markers": Object { @@ -440573,7 +440716,7 @@ Object { "oscpu": "", "physicalCPUs": 0, "platform": "", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Chrome Trace", "sourceURL": "", @@ -440581,10 +440724,63 @@ Object { "startTime": 0, "symbolicated": true, "toolkit": "", - "version": 31, + "version": 32, }, "pages": Array [], "shared": Object { + "sources": Object { + "filename": Array [ + 2, + 4, + 7, + 9, + 13, + 30, + 31, + 34, + 37, + 39, + 45, + 53, + 56, + 58, + 60, + 63, + 70, + 100, + 103, + 107, + 110, + 112, + 115, + ], + "length": 23, + "uuid": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], + }, "stringArray": Array [ "(root)", "applyProfile", @@ -442767,150 +442963,6 @@ Object { 40, null, ], - "fileName": Array [ - null, - 2, - 4, - 4, - 7, - 9, - 4, - 4, - 13, - 13, - 13, - 13, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - null, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 30, - 31, - 31, - 34, - 31, - 31, - 31, - 31, - 37, - null, - 31, - 39, - 39, - 39, - 39, - 39, - 31, - 31, - 31, - 45, - 45, - null, - 31, - 31, - 30, - 37, - null, - 53, - 31, - null, - 56, - 58, - 58, - 60, - 53, - 53, - 53, - 39, - 39, - 63, - 31, - null, - 39, - 39, - 39, - 70, - 70, - 4, - 9, - 4, - 4, - 70, - 70, - 70, - 70, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - null, - null, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 9, - 4, - 4, - 4, - 70, - 70, - 4, - 4, - 4, - 9, - 9, - 4, - 4, - 70, - 70, - 4, - 4, - 4, - 4, - 4, - 70, - 70, - 70, - 4, - 4, - 9, - null, - 100, - 100, - 103, - 103, - 103, - 107, - 107, - 110, - 112, - 112, - 115, - 4, - 4, - null, - ], "isJS": Array [ false, true, @@ -443632,6 +443684,150 @@ Object { 1, -1, ], + "source": Array [ + null, + 0, + 1, + 1, + 2, + 3, + 1, + 1, + 4, + 4, + 4, + 4, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + null, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 5, + 6, + 6, + 7, + 6, + 6, + 6, + 6, + 8, + null, + 6, + 9, + 9, + 9, + 9, + 9, + 6, + 6, + 6, + 10, + 10, + null, + 6, + 6, + 5, + 8, + null, + 11, + 6, + null, + 12, + 13, + 13, + 14, + 11, + 11, + 11, + 9, + 9, + 15, + 6, + null, + 9, + 9, + 9, + 16, + 16, + 1, + 3, + 1, + 1, + 16, + 16, + 16, + 16, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + null, + null, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 3, + 1, + 1, + 1, + 16, + 16, + 1, + 1, + 1, + 3, + 3, + 1, + 1, + 16, + 16, + 1, + 1, + 1, + 1, + 1, + 16, + 16, + 16, + 1, + 1, + 3, + null, + 17, + 17, + 18, + 18, + 18, + 19, + 19, + 20, + 21, + 21, + 22, + 1, + 1, + null, + ], }, "isMainThread": false, "markers": Object { @@ -444870,13 +445066,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -445198,13 +445394,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -445589,13 +445785,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -446089,7 +446285,7 @@ Object { "oscpu": "", "physicalCPUs": 0, "platform": "", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Chrome Trace", "profilingEndTime": 66155012.423, @@ -446099,10 +446295,23 @@ Object { "startTime": 0, "symbolicated": true, "toolkit": "", - "version": 31, + "version": 32, }, "pages": Array [], "shared": Object { + "sources": Object { + "filename": Array [ + 5, + 7, + 13, + ], + "length": 3, + "uuid": Array [ + null, + null, + null, + ], + }, "stringArray": Array [ "(root)", "(program)", @@ -446585,49 +446794,6 @@ Object { 25, 31, ], - "fileName": Array [ - null, - null, - 5, - 7, - 5, - null, - 7, - 7, - 7, - 13, - null, - 13, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - null, - null, - null, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 13, - 7, - null, - 13, - 7, - 7, - 7, - 7, - 7, - 7, - ], "isJS": Array [ false, false, @@ -446844,6 +447010,49 @@ Object { 0, 0, ], + "source": Array [ + null, + null, + 0, + 1, + 0, + null, + 1, + 1, + 1, + 2, + null, + 2, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + null, + null, + null, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 1, + null, + 2, + 1, + 1, + 1, + 1, + 1, + 1, + ], }, "isMainThread": false, "markers": Object { @@ -447103,7 +447312,7 @@ Object { "oscpu": undefined, "physicalCPUs": undefined, "platform": undefined, - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Firefox", "sampleUnits": undefined, @@ -447116,7 +447325,7 @@ Object { "symbolicated": true, "toolkit": undefined, "updateChannel": undefined, - "version": 31, + "version": 32, "visualMetrics": undefined, }, "pages": Array [], @@ -447124,6 +447333,11 @@ Object { "profilerOverhead": Array [], "profilingLog": Object {}, "shared": Object { + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stringArray": Array [ "_start (in /usr/lib64/ld-2.25.so)", "_start", @@ -447388,16 +447602,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -447449,6 +447653,16 @@ Object { 4, 0, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -447631,182 +447845,177 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - ], - "isJS": Array [ - false, - false, - false, - ], - "length": 3, - "lineNumber": Array [ - null, - null, - null, - ], - "name": Array [ - 11, - 21, - 4, - ], - "relevantForJS": Array [ - false, - false, - false, - ], - "resource": Array [ - 0, - 1, - 2, - ], - }, - "isMainThread": false, - "markers": Object { - "category": Array [], - "data": Array [], - "endTime": Array [], - "length": 0, - "name": Array [], - "phase": Array [], - "startTime": Array [], - }, - "name": "firefox", - "nativeSymbols": Object { - "address": Array [], - "functionSize": Array [], - "length": 0, - "libIndex": Array [], - "name": Array [], - }, - "pausedRanges": Array [], - "pid": "7565", - "processName": "", - "processShutdownTime": null, - "processStartupTime": 0, - "processType": "default", - "registerTime": 0, - "resourceTable": Object { - "host": Array [ - null, - null, - null, - ], - "length": 3, - "lib": Array [ - null, - null, - null, - ], - "name": Array [ - 2, - 22, - 5, - ], - "type": Array [ - 1, - 1, - 1, - ], - }, - "samples": Object { - "length": 4, - "responsiveness": Array [ - 0, - 0, - 0, - 0, - ], - "stack": Array [ - 2, - 2, - 2, - 2, - ], - "timeDeltas": Array [ - 2574592843.004, - 0.023, - 0.008, - 0.022, - ], - "weight": null, - "weightType": "samples", - }, - "stackTable": Object { - "frame": Array [ - 0, - 1, - 2, - ], - "length": 3, - "prefix": Array [ - null, - 0, - 1, - ], - }, - "tid": 7565, - "unregisterTime": null, - }, - Object { - "eTLD+1": undefined, - "frameTable": Object { - "address": Array [ - -1, - -1, - -1, - ], - "category": Array [ - 0, - 0, - 1, - ], - "column": Array [ - null, - null, - null, - ], - "func": Array [ - 0, - 1, - 2, - ], - "inlineDepth": Array [ - 0, - 0, - 0, - ], - "innerWindowID": Array [ - 0, - 0, - 0, - ], - "length": 3, - "line": Array [ - null, - null, - null, - ], - "nativeSymbol": Array [ - null, - null, - null, - ], - "subcategory": Array [ - null, - null, - null, - ], - }, - "funcTable": Object { - "columnNumber": Array [ - null, - null, - null, - ], - "fileName": Array [ + "isJS": Array [ + false, + false, + false, + ], + "length": 3, + "lineNumber": Array [ + null, + null, + null, + ], + "name": Array [ + 11, + 21, + 4, + ], + "relevantForJS": Array [ + false, + false, + false, + ], + "resource": Array [ + 0, + 1, + 2, + ], + "source": Array [ + null, + null, + null, + ], + }, + "isMainThread": false, + "markers": Object { + "category": Array [], + "data": Array [], + "endTime": Array [], + "length": 0, + "name": Array [], + "phase": Array [], + "startTime": Array [], + }, + "name": "firefox", + "nativeSymbols": Object { + "address": Array [], + "functionSize": Array [], + "length": 0, + "libIndex": Array [], + "name": Array [], + }, + "pausedRanges": Array [], + "pid": "7565", + "processName": "", + "processShutdownTime": null, + "processStartupTime": 0, + "processType": "default", + "registerTime": 0, + "resourceTable": Object { + "host": Array [ + null, + null, + null, + ], + "length": 3, + "lib": Array [ + null, + null, + null, + ], + "name": Array [ + 2, + 22, + 5, + ], + "type": Array [ + 1, + 1, + 1, + ], + }, + "samples": Object { + "length": 4, + "responsiveness": Array [ + 0, + 0, + 0, + 0, + ], + "stack": Array [ + 2, + 2, + 2, + 2, + ], + "timeDeltas": Array [ + 2574592843.004, + 0.023, + 0.008, + 0.022, + ], + "weight": null, + "weightType": "samples", + }, + "stackTable": Object { + "frame": Array [ + 0, + 1, + 2, + ], + "length": 3, + "prefix": Array [ + null, + 0, + 1, + ], + }, + "tid": 7565, + "unregisterTime": null, + }, + Object { + "eTLD+1": undefined, + "frameTable": Object { + "address": Array [ + -1, + -1, + -1, + ], + "category": Array [ + 0, + 0, + 1, + ], + "column": Array [ + null, + null, + null, + ], + "func": Array [ + 0, + 1, + 2, + ], + "inlineDepth": Array [ + 0, + 0, + 0, + ], + "innerWindowID": Array [ + 0, + 0, + 0, + ], + "length": 3, + "line": Array [ + null, + null, + null, + ], + "nativeSymbol": Array [ + null, + null, + null, + ], + "subcategory": Array [ + null, + null, + null, + ], + }, + "funcTable": Object { + "columnNumber": Array [ null, null, null, @@ -447837,6 +448046,11 @@ Object { 1, 2, ], + "source": Array [ + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -448091,22 +448305,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -448188,6 +448386,22 @@ Object { 6, 6, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -448383,12 +448597,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -448420,6 +448628,12 @@ Object { 2, 3, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -448612,15 +448826,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -448667,6 +448872,15 @@ Object { 2, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -448836,10 +449050,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - ], "isJS": Array [ false, false, @@ -448861,6 +449071,10 @@ Object { 0, 1, ], + "source": Array [ + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -448999,11 +449213,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - ], "isJS": Array [ false, false, @@ -449030,6 +449239,11 @@ Object { 1, 2, ], + "source": Array [ + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -449174,11 +449388,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - ], "isJS": Array [ false, false, @@ -449205,6 +449414,11 @@ Object { 1, 2, ], + "source": Array [ + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -449351,11 +449565,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - ], "isJS": Array [ false, false, @@ -449382,6 +449591,11 @@ Object { 1, 2, ], + "source": Array [ + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -449536,12 +449750,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -449573,6 +449781,12 @@ Object { 2, 3, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -450027,40 +450241,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -450232,6 +450412,40 @@ Object { 1, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -450736,40 +450950,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -450941,6 +451121,40 @@ Object { 1, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -451204,144 +451418,110 @@ Object { null, null, ], - "func": Array [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 27, - 28, - 29, - 30, - 31, - ], - "inlineDepth": Array [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - ], - "innerWindowID": Array [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - ], - "length": 32, - "line": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], - "nativeSymbol": Array [ + "func": Array [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + ], + "inlineDepth": Array [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + "innerWindowID": Array [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + "length": 32, + "line": Array [ null, null, null, @@ -451375,7 +451555,7 @@ Object { null, null, ], - "subcategory": Array [ + "nativeSymbol": Array [ null, null, null, @@ -451409,9 +451589,7 @@ Object { null, null, ], - }, - "funcTable": Object { - "columnNumber": Array [ + "subcategory": Array [ null, null, null, @@ -451445,7 +451623,9 @@ Object { null, null, ], - "fileName": Array [ + }, + "funcTable": Object { + "columnNumber": Array [ null, null, null, @@ -451650,6 +451830,40 @@ Object { 1, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -452156,40 +452370,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -452361,6 +452541,40 @@ Object { 1, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -452747,28 +452961,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -452880,6 +453072,28 @@ Object { 2, 2, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -453037,7 +453251,7 @@ Object { "oscpu": undefined, "physicalCPUs": undefined, "platform": undefined, - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Firefox", "sampleUnits": undefined, @@ -453050,7 +453264,7 @@ Object { "symbolicated": true, "toolkit": undefined, "updateChannel": undefined, - "version": 31, + "version": 32, "visualMetrics": undefined, }, "pages": Array [], @@ -453058,6 +453272,11 @@ Object { "profilerOverhead": Array [], "profilingLog": Object {}, "shared": Object { + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stringArray": Array [ "entry_SYSCALL_64_after_hwframe (in [kernel.kallsyms])", "entry_SYSCALL_64_after_hwframe", @@ -460418,618 +460637,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -464091,6 +463698,618 @@ Object { 0, 0, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -467927,7 +468146,7 @@ Object { "oscpu": undefined, "physicalCPUs": undefined, "platform": undefined, - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Firefox", "sampleUnits": undefined, @@ -467940,7 +468159,7 @@ Object { "symbolicated": true, "toolkit": undefined, "updateChannel": undefined, - "version": 31, + "version": 32, "visualMetrics": undefined, }, "pages": Array [], @@ -467948,6 +468167,11 @@ Object { "profilerOverhead": Array [], "profilingLog": Object {}, "shared": Object { + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stringArray": Array [ "entry_SYSCALL_64_after_hwframe (in [kernel.kallsyms])", "entry_SYSCALL_64_after_hwframe", @@ -470729,237 +470953,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -472116,6 +472109,237 @@ Object { 0, 0, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -474126,7 +474350,7 @@ Object { "oscpu": undefined, "physicalCPUs": undefined, "platform": undefined, - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Firefox", "sampleUnits": undefined, @@ -474139,7 +474363,7 @@ Object { "symbolicated": true, "toolkit": undefined, "updateChannel": undefined, - "version": 31, + "version": 32, "visualMetrics": undefined, }, "pages": Array [], @@ -474147,6 +474371,11 @@ Object { "profilerOverhead": Array [], "profilingLog": Object {}, "shared": Object { + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stringArray": Array [ "base.odex[+41107f] (in /data/app/org.mozilla.geckoview_example-1/oat/arm/base.odex)", "base.odex[+41107f]", @@ -477025,229 +477254,7 @@ Object { null, null, ], - "nativeSymbol": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], - "subcategory": Array [ + "nativeSymbol": Array [ null, null, null, @@ -477469,9 +477476,7 @@ Object { null, null, ], - }, - "funcTable": Object { - "columnNumber": Array [ + "subcategory": Array [ null, null, null, @@ -477693,7 +477698,9 @@ Object { null, null, ], - "fileName": Array [ + }, + "funcTable": Object { + "columnNumber": Array [ null, null, null, @@ -479026,6 +479033,228 @@ Object { 2, 2, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -480280,92 +480509,7 @@ Object { null, null, ], - "nativeSymbol": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], - "subcategory": Array [ + "nativeSymbol": Array [ null, null, null, @@ -480450,9 +480594,7 @@ Object { null, null, ], - }, - "funcTable": Object { - "columnNumber": Array [ + "subcategory": Array [ null, null, null, @@ -480537,7 +480679,9 @@ Object { null, null, ], - "fileName": Array [ + }, + "funcTable": Object { + "columnNumber": Array [ null, null, null, @@ -481048,6 +481192,91 @@ Object { 5, 1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -482152,76 +482381,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -482573,6 +482732,76 @@ Object { 1, 1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -484499,137 +484728,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -485286,6 +485384,137 @@ Object { 7, 0, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -486544,334 +486773,226 @@ Object { null, null, null, - ], - "nativeSymbol": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], - "subcategory": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], - }, - "funcTable": Object { - "columnNumber": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, + ], + "nativeSymbol": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], + "subcategory": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, null, null, ], - "fileName": Array [ + }, + "funcTable": Object { + "columnNumber": Array [ null, null, null, @@ -487520,6 +487641,114 @@ Object { 4, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -488446,48 +488675,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -488699,6 +488886,48 @@ Object { 2, 2, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -489359,55 +489588,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -489654,6 +489834,55 @@ Object { 1, 1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -490184,36 +490413,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -490365,6 +490564,36 @@ Object { 2, 2, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -490697,25 +490926,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -490812,6 +491022,25 @@ Object { 3, 3, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -491099,23 +491328,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -491202,6 +491414,23 @@ Object { 2, 2, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -491471,22 +491700,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -491568,6 +491781,22 @@ Object { 0, 0, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -492044,43 +492273,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -492267,6 +492459,43 @@ Object { 2, 2, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -492529,7 +492758,7 @@ Object { "keepProfileThreadOrder": true, "markerSchema": Array [], "platform": "Android", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "com.example.sampleapplication", "sourceCodeIsNotOnSearchfox": true, @@ -492541,6 +492770,11 @@ Object { "version": 30, }, "shared": Object { + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stringArray": Array [ "/apex/com.android.runtime/lib64/bionic/libc.so", "__libc_init", @@ -495051,29 +495285,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -495190,6 +495401,29 @@ Object { 5, 5, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -495532,27 +495766,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -495659,6 +495872,27 @@ Object { 5, 5, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -495997,27 +496231,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -496124,6 +496337,27 @@ Object { 5, 5, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -510998,1478 +511232,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -519831,6 +518593,1478 @@ Object { 5, 5, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": true, "markers": Object { @@ -532310,25 +532544,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -532425,6 +532640,25 @@ Object { 3, 3, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -535049,257 +535283,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -536556,6 +536539,257 @@ Object { 4, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -538911,7 +539145,31 @@ Object { null, null, ], - "fileName": Array [ + "isJS": Array [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + ], + "length": 21, + "lineNumber": Array [ null, null, null, @@ -538934,7 +539192,30 @@ Object { null, null, ], - "isJS": Array [ + "name": Array [ + 47, + 48, + 1870, + 1871, + 1771, + 1817, + 1834, + 1835, + 1836, + 1837, + 1838, + 1685, + 1686, + 430, + 431, + 59, + 60, + 432, + 433, + 1872, + 1873, + ], + "relevantForJS": Array [ false, false, false, @@ -538957,8 +539238,30 @@ Object { false, false, ], - "length": 21, - "lineNumber": Array [ + "resource": Array [ + 0, + 1, + 2, + 2, + 3, + 3, + 3, + 3, + 3, + 4, + 4, + 5, + 5, + 1, + 1, + 6, + 6, + 6, + 6, + 6, + 6, + ], + "source": Array [ null, null, null, @@ -538981,75 +539284,6 @@ Object { null, null, ], - "name": Array [ - 47, - 48, - 1870, - 1871, - 1771, - 1817, - 1834, - 1835, - 1836, - 1837, - 1838, - 1685, - 1686, - 430, - 431, - 59, - 60, - 432, - 433, - 1872, - 1873, - ], - "relevantForJS": Array [ - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - ], - "resource": Array [ - 0, - 1, - 2, - 2, - 3, - 3, - 3, - 3, - 3, - 4, - 4, - 5, - 5, - 1, - 1, - 6, - 6, - 6, - 6, - 6, - 6, - ], }, "isMainThread": false, "markers": Object { @@ -539194,13 +539428,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -539683,49 +539917,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -539942,6 +540133,49 @@ Object { 6, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -540434,28 +540668,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -540567,6 +540779,28 @@ Object { 5, 5, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -540957,32 +541191,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -541114,6 +541322,32 @@ Object { 2, 2, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -541544,34 +541778,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -541713,6 +541919,34 @@ Object { 5, 5, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -543118,126 +543352,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -543839,6 +543953,126 @@ Object { 4, 1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -547060,267 +547294,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -548627,6 +548600,267 @@ Object { 4, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -555377,533 +555611,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -558540,6 +558247,533 @@ Object { 4, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -561598,7 +561832,7 @@ Object { "keepProfileThreadOrder": true, "markerSchema": Array [], "platform": "Android", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "com.example.sampleapplication", "sourceCodeIsNotOnSearchfox": true, @@ -561610,6 +561844,11 @@ Object { "version": 30, }, "shared": Object { + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stringArray": Array [ "/apex/com.android.runtime/lib64/bionic/libc.so", "__libc_init", @@ -565601,193 +565840,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -566724,6 +566776,193 @@ Object { 3, 3, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -568604,96 +568843,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -569145,6 +569294,96 @@ Object { 1, 10, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -569870,130 +570109,90 @@ Object { null, null, null, - ], - "nativeSymbol": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], - "subcategory": Array [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - ], - }, - "funcTable": Object { - "columnNumber": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, + ], + "nativeSymbol": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, null, null, + null, + null, + null, + null, + ], + "subcategory": Array [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, ], - "fileName": Array [ + }, + "funcTable": Object { + "columnNumber": Array [ null, null, null, @@ -570234,6 +570433,46 @@ Object { 7, 7, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -570722,35 +570961,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -570897,6 +571107,35 @@ Object { 4, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -571427,37 +571666,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -571614,6 +571822,37 @@ Object { 5, 5, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -572114,39 +572353,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -572313,6 +572519,39 @@ Object { 4, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -572707,28 +572946,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -572840,6 +573057,28 @@ Object { 5, 5, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -573758,85 +573997,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -574233,6 +574393,85 @@ Object { 6, 6, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -574927,31 +575166,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -575078,6 +575292,31 @@ Object { 5, 5, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -579030,388 +579269,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -581323,6 +581180,388 @@ Object { 4, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -603641,1709 +603880,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -613860,6 +612396,1709 @@ Object { 5, 5, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": true, "markers": Object { @@ -633490,7 +633729,7 @@ Object { "oscpu": "", "physicalCPUs": 0, "platform": "", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "target/debug/examples/work_log (dhat)", "sourceURL": "", @@ -633498,10 +633737,101 @@ Object { "startTime": 0, "symbolicated": true, "toolkit": "", - "version": 31, + "version": 32, }, "pages": Array [], "shared": Object { + "sources": Object { + "filename": Array [ + 0, + 3, + 5, + 8, + 10, + 16, + 18, + 20, + 25, + 33, + 50, + 52, + 54, + 56, + 67, + 71, + 73, + 75, + 85, + 87, + 91, + 93, + 99, + 101, + 103, + 119, + 121, + 127, + 145, + 152, + 154, + 172, + 179, + 182, + 193, + 195, + 198, + 202, + 207, + 209, + 218, + 220, + ], + "length": 42, + "uuid": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], + }, "stringArray": Array [ "target/debug/examples/work_log", "[root]", @@ -636954,195 +637284,6 @@ Object { 9, 9, ], - "fileName": Array [ - null, - 0, - 3, - 5, - 5, - 8, - 10, - 10, - 10, - 10, - 10, - 16, - 18, - 20, - 20, - 18, - 18, - 25, - 20, - 25, - 18, - 20, - 20, - 18, - 33, - 20, - 33, - 20, - 25, - 33, - 20, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 20, - 20, - 50, - 52, - 54, - 56, - 18, - 18, - 33, - 33, - 33, - 33, - 33, - 33, - 3, - 67, - 67, - 25, - 71, - 73, - 75, - 75, - 75, - 73, - 71, - 71, - 71, - 56, - 8, - 85, - 87, - 87, - 52, - 91, - 93, - 93, - 87, - 87, - 87, - 99, - 101, - 103, - 99, - 99, - 99, - 5, - 5, - 5, - 5, - 8, - 8, - 8, - 8, - 85, - 85, - 25, - 119, - 121, - 25, - 25, - 25, - 85, - 127, - 25, - 127, - 8, - 121, - 121, - 121, - 121, - 25, - 121, - 25, - 121, - 18, - 18, - 18, - 20, - 25, - 145, - 20, - 145, - 145, - 145, - 20, - 152, - 154, - 154, - 18, - 20, - 18, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 172, - 172, - 8, - 85, - 85, - 85, - 179, - 25, - 182, - 182, - 182, - 182, - 8, - 179, - 25, - 182, - 85, - 99, - 193, - 195, - 195, - 198, - 198, - 20, - 202, - 33, - 20, - 25, - 207, - 209, - 8, - 101, - 103, - 99, - 8, - 8, - 8, - 218, - 220, - 25, - 220, - 56, - 87, - 87, - 87, - 87, - ], "isJS": Array [ false, false, @@ -638089,6 +638230,195 @@ Object { -1, -1, ], + "source": Array [ + null, + 0, + 1, + 2, + 2, + 3, + 4, + 4, + 4, + 4, + 4, + 5, + 6, + 7, + 7, + 6, + 6, + 8, + 7, + 8, + 6, + 7, + 7, + 6, + 9, + 7, + 9, + 7, + 8, + 9, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 10, + 11, + 12, + 13, + 6, + 6, + 9, + 9, + 9, + 9, + 9, + 9, + 1, + 14, + 14, + 8, + 15, + 16, + 17, + 17, + 17, + 16, + 15, + 15, + 15, + 13, + 3, + 18, + 19, + 19, + 11, + 20, + 21, + 21, + 19, + 19, + 19, + 22, + 23, + 24, + 22, + 22, + 22, + 2, + 2, + 2, + 2, + 3, + 3, + 3, + 3, + 18, + 18, + 8, + 25, + 26, + 8, + 8, + 8, + 18, + 27, + 8, + 27, + 3, + 26, + 26, + 26, + 26, + 8, + 26, + 8, + 26, + 6, + 6, + 6, + 7, + 8, + 28, + 7, + 28, + 28, + 28, + 7, + 29, + 30, + 30, + 6, + 7, + 6, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 31, + 31, + 3, + 18, + 18, + 18, + 32, + 8, + 33, + 33, + 33, + 33, + 3, + 32, + 8, + 33, + 18, + 22, + 34, + 35, + 35, + 36, + 36, + 7, + 37, + 9, + 7, + 8, + 38, + 39, + 3, + 23, + 24, + 22, + 3, + 3, + 3, + 40, + 41, + 8, + 41, + 13, + 19, + 19, + 19, + 19, + ], }, "isMainThread": false, "markers": Object { @@ -642759,195 +643089,6 @@ Object { 9, 9, ], - "fileName": Array [ - null, - 0, - 3, - 5, - 5, - 8, - 10, - 10, - 10, - 10, - 10, - 16, - 18, - 20, - 20, - 18, - 18, - 25, - 20, - 25, - 18, - 20, - 20, - 18, - 33, - 20, - 33, - 20, - 25, - 33, - 20, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 20, - 20, - 50, - 52, - 54, - 56, - 18, - 18, - 33, - 33, - 33, - 33, - 33, - 33, - 3, - 67, - 67, - 25, - 71, - 73, - 75, - 75, - 75, - 73, - 71, - 71, - 71, - 56, - 8, - 85, - 87, - 87, - 52, - 91, - 93, - 93, - 87, - 87, - 87, - 99, - 101, - 103, - 99, - 99, - 99, - 5, - 5, - 5, - 5, - 8, - 8, - 8, - 8, - 85, - 85, - 25, - 119, - 121, - 25, - 25, - 25, - 85, - 127, - 25, - 127, - 8, - 121, - 121, - 121, - 121, - 25, - 121, - 25, - 121, - 18, - 18, - 18, - 20, - 25, - 145, - 20, - 145, - 145, - 145, - 20, - 152, - 154, - 154, - 18, - 20, - 18, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 172, - 172, - 8, - 85, - 85, - 85, - 179, - 25, - 182, - 182, - 182, - 182, - 8, - 179, - 25, - 182, - 85, - 99, - 193, - 195, - 195, - 198, - 198, - 20, - 202, - 33, - 20, - 25, - 207, - 209, - 8, - 101, - 103, - 99, - 8, - 8, - 8, - 218, - 220, - 25, - 220, - 56, - 87, - 87, - 87, - 87, - ], "isJS": Array [ false, false, @@ -643894,6 +644035,195 @@ Object { -1, -1, ], + "source": Array [ + null, + 0, + 1, + 2, + 2, + 3, + 4, + 4, + 4, + 4, + 4, + 5, + 6, + 7, + 7, + 6, + 6, + 8, + 7, + 8, + 6, + 7, + 7, + 6, + 9, + 7, + 9, + 7, + 8, + 9, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 10, + 11, + 12, + 13, + 6, + 6, + 9, + 9, + 9, + 9, + 9, + 9, + 1, + 14, + 14, + 8, + 15, + 16, + 17, + 17, + 17, + 16, + 15, + 15, + 15, + 13, + 3, + 18, + 19, + 19, + 11, + 20, + 21, + 21, + 19, + 19, + 19, + 22, + 23, + 24, + 22, + 22, + 22, + 2, + 2, + 2, + 2, + 3, + 3, + 3, + 3, + 18, + 18, + 8, + 25, + 26, + 8, + 8, + 8, + 18, + 27, + 8, + 27, + 3, + 26, + 26, + 26, + 26, + 8, + 26, + 8, + 26, + 6, + 6, + 6, + 7, + 8, + 28, + 7, + 28, + 28, + 28, + 7, + 29, + 30, + 30, + 6, + 7, + 6, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 31, + 31, + 3, + 18, + 18, + 18, + 32, + 8, + 33, + 33, + 33, + 33, + 3, + 32, + 8, + 33, + 18, + 22, + 34, + 35, + 35, + 36, + 36, + 7, + 37, + 9, + 7, + 8, + 38, + 39, + 3, + 23, + 24, + 22, + 3, + 3, + 3, + 40, + 41, + 8, + 41, + 13, + 19, + 19, + 19, + 19, + ], }, "isMainThread": false, "markers": Object { @@ -648564,195 +648894,6 @@ Object { 9, 9, ], - "fileName": Array [ - null, - 0, - 3, - 5, - 5, - 8, - 10, - 10, - 10, - 10, - 10, - 16, - 18, - 20, - 20, - 18, - 18, - 25, - 20, - 25, - 18, - 20, - 20, - 18, - 33, - 20, - 33, - 20, - 25, - 33, - 20, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 20, - 20, - 50, - 52, - 54, - 56, - 18, - 18, - 33, - 33, - 33, - 33, - 33, - 33, - 3, - 67, - 67, - 25, - 71, - 73, - 75, - 75, - 75, - 73, - 71, - 71, - 71, - 56, - 8, - 85, - 87, - 87, - 52, - 91, - 93, - 93, - 87, - 87, - 87, - 99, - 101, - 103, - 99, - 99, - 99, - 5, - 5, - 5, - 5, - 8, - 8, - 8, - 8, - 85, - 85, - 25, - 119, - 121, - 25, - 25, - 25, - 85, - 127, - 25, - 127, - 8, - 121, - 121, - 121, - 121, - 25, - 121, - 25, - 121, - 18, - 18, - 18, - 20, - 25, - 145, - 20, - 145, - 145, - 145, - 20, - 152, - 154, - 154, - 18, - 20, - 18, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 172, - 172, - 8, - 85, - 85, - 85, - 179, - 25, - 182, - 182, - 182, - 182, - 8, - 179, - 25, - 182, - 85, - 99, - 193, - 195, - 195, - 198, - 198, - 20, - 202, - 33, - 20, - 25, - 207, - 209, - 8, - 101, - 103, - 99, - 8, - 8, - 8, - 218, - 220, - 25, - 220, - 56, - 87, - 87, - 87, - 87, - ], "isJS": Array [ false, false, @@ -649699,6 +649840,195 @@ Object { -1, -1, ], + "source": Array [ + null, + 0, + 1, + 2, + 2, + 3, + 4, + 4, + 4, + 4, + 4, + 5, + 6, + 7, + 7, + 6, + 6, + 8, + 7, + 8, + 6, + 7, + 7, + 6, + 9, + 7, + 9, + 7, + 8, + 9, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 10, + 11, + 12, + 13, + 6, + 6, + 9, + 9, + 9, + 9, + 9, + 9, + 1, + 14, + 14, + 8, + 15, + 16, + 17, + 17, + 17, + 16, + 15, + 15, + 15, + 13, + 3, + 18, + 19, + 19, + 11, + 20, + 21, + 21, + 19, + 19, + 19, + 22, + 23, + 24, + 22, + 22, + 22, + 2, + 2, + 2, + 2, + 3, + 3, + 3, + 3, + 18, + 18, + 8, + 25, + 26, + 8, + 8, + 8, + 18, + 27, + 8, + 27, + 3, + 26, + 26, + 26, + 26, + 8, + 26, + 8, + 26, + 6, + 6, + 6, + 7, + 8, + 28, + 7, + 28, + 28, + 28, + 7, + 29, + 30, + 30, + 6, + 7, + 6, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 31, + 31, + 3, + 18, + 18, + 18, + 32, + 8, + 33, + 33, + 33, + 33, + 3, + 32, + 8, + 33, + 18, + 22, + 34, + 35, + 35, + 36, + 36, + 7, + 37, + 9, + 7, + 8, + 38, + 39, + 3, + 23, + 24, + 22, + 3, + 3, + 3, + 40, + 41, + 8, + 41, + 13, + 19, + 19, + 19, + 19, + ], }, "isMainThread": false, "markers": Object { @@ -654369,195 +654699,6 @@ Object { 9, 9, ], - "fileName": Array [ - null, - 0, - 3, - 5, - 5, - 8, - 10, - 10, - 10, - 10, - 10, - 16, - 18, - 20, - 20, - 18, - 18, - 25, - 20, - 25, - 18, - 20, - 20, - 18, - 33, - 20, - 33, - 20, - 25, - 33, - 20, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 20, - 20, - 50, - 52, - 54, - 56, - 18, - 18, - 33, - 33, - 33, - 33, - 33, - 33, - 3, - 67, - 67, - 25, - 71, - 73, - 75, - 75, - 75, - 73, - 71, - 71, - 71, - 56, - 8, - 85, - 87, - 87, - 52, - 91, - 93, - 93, - 87, - 87, - 87, - 99, - 101, - 103, - 99, - 99, - 99, - 5, - 5, - 5, - 5, - 8, - 8, - 8, - 8, - 85, - 85, - 25, - 119, - 121, - 25, - 25, - 25, - 85, - 127, - 25, - 127, - 8, - 121, - 121, - 121, - 121, - 25, - 121, - 25, - 121, - 18, - 18, - 18, - 20, - 25, - 145, - 20, - 145, - 145, - 145, - 20, - 152, - 154, - 154, - 18, - 20, - 18, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 172, - 172, - 8, - 85, - 85, - 85, - 179, - 25, - 182, - 182, - 182, - 182, - 8, - 179, - 25, - 182, - 85, - 99, - 193, - 195, - 195, - 198, - 198, - 20, - 202, - 33, - 20, - 25, - 207, - 209, - 8, - 101, - 103, - 99, - 8, - 8, - 8, - 218, - 220, - 25, - 220, - 56, - 87, - 87, - 87, - 87, - ], "isJS": Array [ false, false, @@ -655504,6 +655645,195 @@ Object { -1, -1, ], + "source": Array [ + null, + 0, + 1, + 2, + 2, + 3, + 4, + 4, + 4, + 4, + 4, + 5, + 6, + 7, + 7, + 6, + 6, + 8, + 7, + 8, + 6, + 7, + 7, + 6, + 9, + 7, + 9, + 7, + 8, + 9, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 10, + 11, + 12, + 13, + 6, + 6, + 9, + 9, + 9, + 9, + 9, + 9, + 1, + 14, + 14, + 8, + 15, + 16, + 17, + 17, + 17, + 16, + 15, + 15, + 15, + 13, + 3, + 18, + 19, + 19, + 11, + 20, + 21, + 21, + 19, + 19, + 19, + 22, + 23, + 24, + 22, + 22, + 22, + 2, + 2, + 2, + 2, + 3, + 3, + 3, + 3, + 18, + 18, + 8, + 25, + 26, + 8, + 8, + 8, + 18, + 27, + 8, + 27, + 3, + 26, + 26, + 26, + 26, + 8, + 26, + 8, + 26, + 6, + 6, + 6, + 7, + 8, + 28, + 7, + 28, + 28, + 28, + 7, + 29, + 30, + 30, + 6, + 7, + 6, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 31, + 31, + 3, + 18, + 18, + 18, + 32, + 8, + 33, + 33, + 33, + 33, + 3, + 32, + 8, + 33, + 18, + 22, + 34, + 35, + 35, + 36, + 36, + 7, + 37, + 9, + 7, + 8, + 38, + 39, + 3, + 23, + 24, + 22, + 3, + 3, + 3, + 40, + 41, + 8, + 41, + 13, + 19, + 19, + 19, + 19, + ], }, "isMainThread": false, "markers": Object { diff --git a/src/test/unit/__snapshots__/profile-upgrading.test.ts.snap b/src/test/unit/__snapshots__/profile-upgrading.test.ts.snap index 52b066540a..03f2801ef5 100644 --- a/src/test/unit/__snapshots__/profile-upgrading.test.ts.snap +++ b/src/test/unit/__snapshots__/profile-upgrading.test.ts.snap @@ -40,7 +40,7 @@ Object { "oscpu": undefined, "physicalCPUs": undefined, "platform": undefined, - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Firefox", "sampleUnits": undefined, @@ -53,7 +53,7 @@ Object { "symbolicated": true, "toolkit": undefined, "updateChannel": undefined, - "version": 31, + "version": 32, "visualMetrics": undefined, }, "pages": Array [], @@ -61,6 +61,11 @@ Object { "profilerOverhead": Array [], "profilingLog": Object {}, "shared": Object { + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stringArray": Array [ "_start (in /usr/lib64/ld-2.25.so)", "_start", @@ -325,16 +330,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -386,6 +381,16 @@ Object { 4, 0, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -568,11 +573,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - ], "isJS": Array [ false, false, @@ -599,6 +599,11 @@ Object { 1, 2, ], + "source": Array [ + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -743,11 +748,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - ], "isJS": Array [ false, false, @@ -774,6 +774,11 @@ Object { 1, 2, ], + "source": Array [ + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -1028,22 +1033,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -1125,6 +1114,22 @@ Object { 6, 6, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -1320,12 +1325,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -1357,6 +1356,12 @@ Object { 2, 3, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -1549,15 +1554,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -1604,6 +1600,15 @@ Object { 2, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -1773,10 +1778,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - ], "isJS": Array [ false, false, @@ -1798,6 +1799,10 @@ Object { 0, 1, ], + "source": Array [ + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -1936,11 +1941,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - ], "isJS": Array [ false, false, @@ -1967,6 +1967,11 @@ Object { 1, 2, ], + "source": Array [ + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -2111,11 +2116,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - ], "isJS": Array [ false, false, @@ -2142,6 +2142,11 @@ Object { 1, 2, ], + "source": Array [ + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -2288,11 +2293,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - ], "isJS": Array [ false, false, @@ -2319,6 +2319,11 @@ Object { 1, 2, ], + "source": Array [ + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -2473,12 +2478,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -2510,6 +2509,12 @@ Object { 2, 3, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -2964,40 +2969,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -3169,6 +3140,40 @@ Object { 1, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -3673,40 +3678,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -3878,6 +3849,40 @@ Object { 1, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -4382,40 +4387,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -4587,6 +4558,40 @@ Object { 1, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -5093,40 +5098,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -5298,6 +5269,40 @@ Object { 1, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -5684,28 +5689,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -5817,6 +5800,28 @@ Object { 2, 2, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -6384,7 +6389,7 @@ Object { "stackwalk": 1, "startTime": 1460221352723.438, "toolkit": "cocoa", - "version": 31, + "version": 32, }, "pausedRanges": Array [], "processes": Array [ @@ -7840,7 +7845,7 @@ Object { "stackwalk": 1, "startTime": 1460221352723.438, "toolkit": "cocoa", - "version": 31, + "version": 32, }, "pages": Array [ Object { @@ -9377,7 +9382,7 @@ Object { "misc": "rv:48.0", "oscpu": "Intel Mac OS X 10.11", "platform": "Macintosh", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Firefox", "stackwalk": 1, @@ -9386,6 +9391,15 @@ Object { "version": 3, }, "shared": Object { + "sources": Object { + "filename": Array [ + 10, + ], + "length": 1, + "uuid": Array [ + null, + ], + }, "stringArray": Array [ "VsyncTimestamp", "Reflow", @@ -9496,13 +9510,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - 10, - ], "isJS": Array [ false, false, @@ -9539,6 +9546,13 @@ Object { -1, 1, ], + "source": Array [ + null, + null, + null, + null, + 0, + ], }, "isMainThread": true, "markers": Object { @@ -9854,13 +9868,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - 10, - ], "isJS": Array [ false, false, @@ -9897,6 +9904,13 @@ Object { -1, 1, ], + "source": Array [ + null, + null, + null, + null, + 0, + ], }, "isMainThread": true, "markers": Object { @@ -10212,13 +10226,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - 10, - ], "isJS": Array [ false, false, @@ -10255,6 +10262,13 @@ Object { -1, 1, ], + "source": Array [ + null, + null, + null, + null, + 0, + ], }, "isMainThread": true, "markers": Object { @@ -10910,7 +10924,7 @@ Object { "misc": "rv:48.0", "oscpu": "Intel Mac OS X 10.11", "platform": "Macintosh", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Firefox", "stackwalk": 1, @@ -10919,6 +10933,15 @@ Object { "version": 4, }, "shared": Object { + "sources": Object { + "filename": Array [ + 11, + ], + "length": 1, + "uuid": Array [ + null, + ], + }, "stringArray": Array [ "VsyncTimestamp", "Reflow", @@ -11032,13 +11055,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - 11, - ], "isJS": Array [ false, false, @@ -11075,6 +11091,13 @@ Object { -1, 1, ], + "source": Array [ + null, + null, + null, + null, + 0, + ], }, "isMainThread": true, "markers": Object { @@ -11414,13 +11437,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - 11, - ], "isJS": Array [ false, false, @@ -11457,6 +11473,13 @@ Object { -1, 1, ], + "source": Array [ + null, + null, + null, + null, + 0, + ], }, "isMainThread": true, "markers": Object { @@ -11792,15 +11815,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - 11, - null, - null, - ], "isJS": Array [ false, false, @@ -11847,6 +11861,15 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + 0, + null, + null, + ], }, "isMainThread": true, "markers": Object { @@ -12576,7 +12599,7 @@ Object { "misc": "rv:48.0", "oscpu": "Intel Mac OS X 10.11", "platform": "Macintosh", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Firefox", "stackwalk": 1, @@ -12611,6 +12634,15 @@ Object { }, ], "shared": Object { + "sources": Object { + "filename": Array [ + 12, + ], + "length": 1, + "uuid": Array [ + null, + ], + }, "stringArray": Array [ "VsyncTimestamp", "Reflow", @@ -12725,13 +12757,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - 12, - ], "isJS": Array [ false, false, @@ -12768,6 +12793,13 @@ Object { -1, 1, ], + "source": Array [ + null, + null, + null, + null, + 0, + ], }, "isMainThread": true, "markers": Object { @@ -13119,13 +13151,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - 12, - ], "isJS": Array [ false, false, @@ -13162,6 +13187,13 @@ Object { -1, 1, ], + "source": Array [ + null, + null, + null, + null, + 0, + ], }, "isMainThread": true, "markers": Object { @@ -13499,15 +13531,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - 12, - null, - null, - ], "isJS": Array [ false, false, @@ -13554,6 +13577,15 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + 0, + null, + null, + ], }, "isMainThread": true, "markers": Object { diff --git a/src/test/unit/fetch-assembly.test.ts b/src/test/unit/fetch-assembly.test.ts index f106f21f68..a03404d8b0 100644 --- a/src/test/unit/fetch-assembly.test.ts +++ b/src/test/unit/fetch-assembly.test.ts @@ -74,6 +74,9 @@ describe('fetchAssembly', function () { ) => { throw new Error('No browser connection'); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, }) ).toEqual({ type: 'SUCCESS', @@ -145,6 +148,9 @@ describe('fetchAssembly', function () { ) => { throw new Error('No browser connection'); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).type @@ -175,6 +181,9 @@ describe('fetchAssembly', function () { } return exampleResponse; }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).type @@ -193,6 +202,9 @@ describe('fetchAssembly', function () { ) => { throw new Error('No browser connection'); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, }) ).toEqual({ type: 'ERROR', @@ -231,6 +243,9 @@ describe('fetchAssembly', function () { ) => { return exampleResponse; }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).type diff --git a/src/test/unit/fetch-source.test.ts b/src/test/unit/fetch-source.test.ts index 552737cfc8..7bb7b38e21 100644 --- a/src/test/unit/fetch-source.test.ts +++ b/src/test/unit/fetch-source.test.ts @@ -4,11 +4,14 @@ import { fetchSource } from 'firefox-profiler/utils/fetch-source'; +const TEST_SOURCE_UUID = 'ff6d24c3-b8f5-45cd-a7d3-b643b3292e41'; + describe('fetchSource', function () { it('fetches single files', async function () { expect( await fetchSource( 'hg:hg.mozilla.org/mozilla-central:widget/cocoa/nsAppShell.mm:997f00815e6bc28806b75448c8829f0259d2cb28', + null, 'https://symbolication.services.mozilla.com', null, new Map(), @@ -25,6 +28,9 @@ describe('fetchSource', function () { ) => { throw new Error('No browser connection'); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).toEqual({ @@ -66,16 +72,24 @@ describe('fetchSource', function () { ) => { throw new Error('No browser connection'); }; + const fetchJSSourceFromBrowser = async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }; const archiveCache = new Map>(); expect( await fetchSource( 'cargo:github.com-1ecc6299db9ec823:addr2line-0.17.0:src/lib.rs', + null, 'https://symbolication.services.mozilla.com', null, archiveCache, - { fetchUrlResponse, queryBrowserSymbolicationApi } + { + fetchUrlResponse, + queryBrowserSymbolicationApi, + fetchJSSourceFromBrowser, + } ) ).toEqual({ type: 'SUCCESS', @@ -90,10 +104,15 @@ describe('fetchSource', function () { expect( await fetchSource( 'cargo:github.com-1ecc6299db9ec823:addr2line-0.17.0:src/function.rs', + null, 'https://symbolication.services.mozilla.com', null, archiveCache, - { fetchUrlResponse, queryBrowserSymbolicationApi } + { + fetchUrlResponse, + queryBrowserSymbolicationApi, + fetchJSSourceFromBrowser, + } ) ).toEqual({ type: 'SUCCESS', @@ -106,10 +125,15 @@ describe('fetchSource', function () { expect( await fetchSource( 'cargo:github.com-1ecc6299db9ec823:addr2line-0.17.0:src/nonexist.rs', + null, 'https://symbolication.services.mozilla.com', null, archiveCache, - { fetchUrlResponse, queryBrowserSymbolicationApi } + { + fetchUrlResponse, + queryBrowserSymbolicationApi, + fetchJSSourceFromBrowser, + } ) ).toEqual({ type: 'ERROR', @@ -129,6 +153,7 @@ describe('fetchSource', function () { expect( await fetchSource( 'hg:hg.mozilla.org/mozilla-central:widget/cocoa/nsAppShell.mm:997f00815e6bc28806b75448c8829f0259d2cb28', + null, 'https://symbolication.services.mozilla.com', null, new Map(), @@ -143,6 +168,9 @@ describe('fetchSource', function () { // Shouldn't be called anyway because we're not providing an AddressProof. throw new Error('No browser connection'); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).toEqual({ @@ -161,6 +189,7 @@ describe('fetchSource', function () { expect( await fetchSource( '/Users/mstange/code/mozilla/gfx/wr/webrender/src/renderer/mod.rs', + null, 'https://symbolication.services.mozilla.com', { debugName: 'FAKE_DEBUGNAME', @@ -186,6 +215,9 @@ describe('fetchSource', function () { source: `Fake source from browser symbolication API, for request JSON ${requestJson}`, }); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).toEqual({ @@ -199,6 +231,7 @@ describe('fetchSource', function () { expect( await fetchSource( '/Users/mstange/code/mozilla/gfx/wr/webrender/src/renderer/mod.rs', + null, 'http://127.0.0.1:3000', { debugName: 'FAKE_DEBUGNAME', @@ -236,6 +269,9 @@ describe('fetchSource', function () { ) => { throw new Error('No browser connection'); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).toEqual({ @@ -249,6 +285,7 @@ describe('fetchSource', function () { expect( await fetchSource( 'git:github.com/rust-lang/rust:library/core/src/intrinsics.rs:acbe4443cc4c9695c0b74a7b64b60333c990a400', + null, 'http://127.0.0.1:3001', { debugName: 'FAKE_DEBUGNAME', @@ -286,6 +323,9 @@ describe('fetchSource', function () { ) => { throw new Error('No browser connection'); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).toEqual({ @@ -299,6 +339,7 @@ describe('fetchSource', function () { expect( await fetchSource( 'git:github.com/rust-lang/rust:library/core/src/intrinsics.rs:acbe4443cc4c9695c0b74a7b64b60333c990a400', + null, 'http://127.0.0.1:3002', { debugName: 'FAKE_DEBUGNAME', @@ -334,6 +375,9 @@ describe('fetchSource', function () { ) => { throw new Error('No browser connection'); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).toEqual({ @@ -347,6 +391,7 @@ describe('fetchSource', function () { expect( await fetchSource( 'git:github.com/rust-lang/rust:library/core/src/intrinsics.rs:acbe4443cc4c9695c0b74a7b64b60333c990a400', + null, 'http://127.0.0.1:3003', { debugName: 'FAKE_DEBUGNAME', @@ -364,6 +409,9 @@ describe('fetchSource', function () { ) => { throw new Error('No browser connection'); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).toEqual({ @@ -391,6 +439,7 @@ describe('fetchSource', function () { expect( await fetchSource( 'git:git.iximeow.net/yaxpeax-arm:src/armv8/a64.rs:0663147eacdef847cc1bdc07cf89eed14b1aeaca', + null, 'https://symbolication.services.mozilla.com', null, new Map(), @@ -404,6 +453,9 @@ describe('fetchSource', function () { ) => { throw new Error('No browser connection'); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).toEqual({ @@ -416,6 +468,7 @@ describe('fetchSource', function () { expect( await fetchSource( '/Users/mstange/code/mozilla/gfx/wr/webrender/src/renderer/mod.rs', + null, 'https://symbolication.services.mozilla.com', { debugName: 'FAKE_DEBUGNAME', @@ -436,6 +489,9 @@ describe('fetchSource', function () { } return '[Invalid \\ JSON}'; }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).toEqual({ @@ -456,6 +512,7 @@ describe('fetchSource', function () { expect( await fetchSource( '/Users/mstange/code/mozilla/gfx/wr/webrender/src/renderer/mod.rs', + null, 'https://symbolication.services.mozilla.com', { debugName: 'FAKE_DEBUGNAME', @@ -481,6 +538,9 @@ describe('fetchSource', function () { hahaYouThoughtThereWouldBeSourceHereButNo: 42, }); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).toEqual({ @@ -496,4 +556,111 @@ describe('fetchSource', function () { ], }); }); + + it('fetches JS source from browser with sourceUuid', async function () { + expect( + await fetchSource( + '/path/to/script.js', + TEST_SOURCE_UUID, + 'https://symbolication.services.mozilla.com', + null, + new Map(), + { + fetchUrlResponse: async (_url: string, _postData?: string) => { + throw new Error('Should not fetch from URL'); + }, + queryBrowserSymbolicationApi: async ( + _path: string, + _requestJson: string + ) => { + throw new Error('Should not query TEST_SOURCE_UUID API'); + }, + fetchJSSourceFromBrowser: async (sourceUuid: string) => { + if (sourceUuid === TEST_SOURCE_UUID) { + return `console.log("Hello from browser with sourceUuid ${sourceUuid}");`; + } + throw new Error(`Unexpected source: ${sourceUuid}`); + }, + } + ) + ).toEqual({ + type: 'SUCCESS', + source: `console.log("Hello from browser with sourceUuid ${TEST_SOURCE_UUID}");`, + }); + }); + + it('handles fetch JS source from browser with invalid sourceUuid', async function () { + expect( + await fetchSource( + '/path/to/script.js', + TEST_SOURCE_UUID, + 'https://symbolication.services.mozilla.com', + null, + new Map(), + { + fetchUrlResponse: async (_url: string, _postData?: string) => { + throw new Error('Should not fetch from URL'); + }, + queryBrowserSymbolicationApi: async ( + _path: string, + _requestJson: string + ) => { + throw new Error('Should not query symbolication API'); + }, + fetchJSSourceFromBrowser: async (sourceUuid: string) => { + throw new Error( + `Source not found for source with ID: ${sourceUuid}` + ); + }, + } + ) + ).toEqual({ + type: 'ERROR', + errors: [ + { + type: 'NOT_PRESENT_IN_BROWSER', + sourceUuid: 'ff6d24c3-b8f5-45cd-a7d3-b643b3292e41', + url: '/path/to/script.js', + errorMessage: `Error: Source not found for source with ID: ${TEST_SOURCE_UUID}`, + }, + { + type: 'NO_KNOWN_CORS_URL', + }, + ], + }); + }); + + it('falls back to other methods when fetchJSSourceFromBrowser fails', async function () { + expect( + await fetchSource( + 'hg:hg.mozilla.org/mozilla-central:widget/cocoa/nsAppShell.mm:997f00815e6bc28806b75448c8829f0259d2cb28', + // Should still try browser first but fall back to URL fetch + TEST_SOURCE_UUID, + 'https://symbolication.services.mozilla.com', + null, + new Map(), + { + fetchUrlResponse: async (url: string, _postData?: string) => { + const r = new Response(`Fallback response from ${url}`, { + status: 200, + }); + return r; + }, + queryBrowserSymbolicationApi: async ( + _path: string, + _requestJson: string + ) => { + throw new Error('No browser connection'); + }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('Source not found in browser'); + }, + } + ) + ).toEqual({ + type: 'SUCCESS', + source: + 'Fallback response from https://hg.mozilla.org/mozilla-central/raw-file/997f00815e6bc28806b75448c8829f0259d2cb28/widget/cocoa/nsAppShell.mm', + }); + }); }); diff --git a/src/test/unit/global-data-collector.test.ts b/src/test/unit/global-data-collector.test.ts new file mode 100644 index 0000000000..6f5ea4dffa --- /dev/null +++ b/src/test/unit/global-data-collector.test.ts @@ -0,0 +1,136 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import { GlobalDataCollector } from '../../profile-logic/global-data-collector'; +import { StringTable } from '../../utils/string-table'; + +describe('GlobalDataCollector', function () { + describe('source table management', function () { + it('should create an empty source table', function () { + const collector = new GlobalDataCollector(); + const { shared } = collector.finish(); + + expect(shared.sources.filename).toEqual([]); + expect(shared.sources.uuid).toEqual([]); + expect(shared.sources.length).toBe(0); + }); + + it('should add unique sources and return correct indexes', function () { + const collector = new GlobalDataCollector(); + + // Add different sources + const sourceIndex1 = collector.indexForSource(null, 'file1.js'); + const sourceIndex2 = collector.indexForSource('uuid2', 'file2.js'); + // Duplicate filename but different UUID + const sourceIndex3 = collector.indexForSource('uuid3', 'file1.js'); + + expect(sourceIndex1).toBe(0); + expect(sourceIndex2).toBe(1); + expect(sourceIndex3).toBe(2); + + const { shared } = collector.finish(); + const stringTable = StringTable.withBackingArray(shared.stringArray); + + const file1Index = stringTable.indexForString('file1.js'); + const file2Index = stringTable.indexForString('file2.js'); + + expect(shared.sources.filename).toEqual([ + file1Index, + file2Index, + file1Index, + ]); + expect(shared.sources.uuid).toEqual([null, 'uuid2', 'uuid3']); + expect(shared.sources.length).toBe(3); + }); + + it('should return existing index for duplicate filename/uuid combinations', function () { + const collector = new GlobalDataCollector(); + + // Add the same source twice + const sourceIndex1 = collector.indexForSource('same-uuid', 'file1.js'); + const sourceIndex2 = collector.indexForSource('same-uuid', 'file1.js'); + + expect(sourceIndex1).toBe(sourceIndex2); + expect(sourceIndex1).toBe(0); + + const { shared } = collector.finish(); + + expect(shared.sources.uuid).toEqual(['same-uuid']); + expect(shared.sources.length).toBe(1); + }); + + it('should handle null UUIDs correctly', function () { + const collector = new GlobalDataCollector(); + + // Add the same filename with null UUID twice + const sourceIndex1 = collector.indexForSource(null, 'file1.js'); + const sourceIndex2 = collector.indexForSource(null, 'file1.js'); + + expect(sourceIndex1).toBe(sourceIndex2); + expect(sourceIndex1).toBe(0); + + const { shared } = collector.finish(); + + expect(shared.sources.uuid).toEqual([null]); + expect(shared.sources.length).toBe(1); + }); + + it('should handle different UUIDs for the same filename', function () { + const collector = new GlobalDataCollector(); + + // Add same filename with different UUIDs + const sourceIndex1 = collector.indexForSource('uuid1', 'file1.js'); + const sourceIndex2 = collector.indexForSource('uuid2', 'file1.js'); + const sourceIndex3 = collector.indexForSource(null, 'file1.js'); + + expect(sourceIndex1).toBe(0); + expect(sourceIndex2).toBe(1); + expect(sourceIndex3).toBe(2); + + const { shared } = collector.finish(); + + expect(shared.sources.uuid).toEqual(['uuid1', 'uuid2', null]); + expect(shared.sources.length).toBe(3); + }); + }); + + describe('string table integration', function () { + it('should maintain correct string table state', function () { + const collector = new GlobalDataCollector(); + + // Add sources + collector.indexForSource(null, 'first.js'); + collector.indexForSource('uuid', 'second.js'); + + const { shared } = collector.finish(); + + expect(shared.stringArray).toEqual(['first.js', 'second.js']); + const stringTable = StringTable.withBackingArray(shared.stringArray); + const firstIndex = stringTable.indexForString('first.js'); + const secondIndex = stringTable.indexForString('second.js'); + expect(shared.sources.filename).toEqual([firstIndex, secondIndex]); + }); + + it('should handle string deduplication correctly', function () { + const collector = new GlobalDataCollector(); + + // Add a source, then add another source with the same filename + const sourceIndex1 = collector.indexForSource('uuid1', 'same.js'); + const sourceIndex2 = collector.indexForSource('uuid2', 'same.js'); + + // Should be different source indexes since UUIDs are different + expect(sourceIndex1).not.toBe(sourceIndex2); + + const { shared } = collector.finish(); + + // Should have both files with the same filename string but different source entries + const stringTable = StringTable.withBackingArray(shared.stringArray); + const filenameIndex = stringTable.indexForString('same.js'); + + expect(shared.sources.filename).toEqual([filenameIndex, filenameIndex]); + expect(shared.sources.uuid).toEqual(['uuid1', 'uuid2']); + expect(shared.sources.length).toBe(2); + }); + }); +}); diff --git a/src/test/unit/line-timings.test.ts b/src/test/unit/line-timings.test.ts index 17de471bfc..e6d096ea77 100644 --- a/src/test/unit/line-timings.test.ts +++ b/src/test/unit/line-timings.test.ts @@ -30,12 +30,14 @@ describe('getStackLineInfo', function () { const [thread] = derivedThreads; const { stackTable, frameTable, funcTable, stringTable } = thread; - const fileOne = stringTable.indexForString('one.js'); + const fileOneStringIndex = stringTable.indexForString('one.js'); + const fileOneSourceIndex = + thread.sources.filename.indexOf(fileOneStringIndex); const stackLineInfoOne = getStackLineInfo( stackTable, frameTable, funcTable, - fileOne + fileOneSourceIndex ); // Expect the returned arrays to have the same length as the stackTable. @@ -49,11 +51,12 @@ describe('getLineTimings for getStackLineInfo', function () { function getTimings(thread: Thread, file: string) { const { stackTable, frameTable, funcTable, samples, stringTable } = thread; const fileStringIndex = stringTable.indexForString(file); + const fileSourceIndex = thread.sources.filename.indexOf(fileStringIndex); const stackLineInfo = getStackLineInfo( stackTable, frameTable, funcTable, - fileStringIndex + fileSourceIndex ); return getLineTimings(stackLineInfo, samples); } diff --git a/src/test/unit/marker-data.test.ts b/src/test/unit/marker-data.test.ts index c90717aa88..0f2f8d715d 100644 --- a/src/test/unit/marker-data.test.ts +++ b/src/test/unit/marker-data.test.ts @@ -33,6 +33,7 @@ import { makeEndMarker, } from '../fixtures/profiles/processed-profile'; import { storeWithProfile } from '../fixtures/stores'; +import { getEmptySourceTable } from '../../profile-logic/data-structures'; import type { IndexIntoRawMarkerTable, @@ -789,6 +790,7 @@ describe('filterRawMarkerTableToRange', () => { function setup({ start, end, markers }: TestConfig) { const shared: RawProfileSharedData = { stringArray: [], + sources: getEmptySourceTable(), }; const thread = getThreadWithRawMarkers(shared, markers); @@ -1281,6 +1283,7 @@ describe('filterRawMarkerTableToRangeWithMarkersToDelete', () => { function setup({ timeRange, markersToDelete, markers }: TestConfig) { const shared: RawProfileSharedData = { stringArray: [], + sources: getEmptySourceTable(), }; const thread = getThreadWithRawMarkers(shared, markers); diff --git a/src/test/unit/merge-compare.test.ts b/src/test/unit/merge-compare.test.ts index a1ef1fb95c..41458861e2 100644 --- a/src/test/unit/merge-compare.test.ts +++ b/src/test/unit/merge-compare.test.ts @@ -15,6 +15,7 @@ import { import { markerSchemaForTests } from '../fixtures/profiles/marker-schema'; import { ensureExists } from 'firefox-profiler/utils/types'; import { getTimeRangeIncludingAllThreads } from 'firefox-profiler/profile-logic/profile-data'; +import { StringTable } from '../../utils/string-table'; import type { RawThread, RawProfileSharedData, @@ -612,3 +613,203 @@ describe('mergeThreads function', function () { expect(string2AfterMerge).toBe(uniqueString2); }); }); + +describe('mergeProfilesForDiffing with source tables', function () { + it('should merge source tables from multiple profiles correctly', function () { + // Create first profile with some sources + const profileA = getProfileFromTextSamples(` + A[file:one.js] A[file:one.js] + B[file:two.js] C[file:three.js] + `); + + // Create second profile with overlapping and unique sources + const profileB = getProfileFromTextSamples(` + X[file:two.js] X[file:two.js] + Y[file:four.js] Z[file:one.js] + `); + + const profileState = stateFromLocation({ + pathname: '/public/fakehash1/', + search: '?thread=0&v=3', + hash: '', + }); + + const { profile: mergedProfile } = mergeProfilesForDiffing( + [profileA.profile, profileB.profile], + [profileState, profileState] + ); + + const { sources } = mergedProfile.shared; + const stringTable = StringTable.withBackingArray( + mergedProfile.shared.stringArray + ); + + expect(sources.length).toBe(4); + // Check that all unique sources are present + const sourceFilenames = sources.filename.map((index) => + stringTable.getString(index) + ); + + expect(sourceFilenames).toHaveLength(4); + expect(sourceFilenames).toEqual( + expect.arrayContaining(['one.js', 'two.js', 'three.js', 'four.js']) + ); + + // Check that UUIDs are properly handled (should all be null for text samples) + expect(sources.uuid).toEqual([null, null, null, null]); + + // Verify each filename index points to a valid string + for (const filenameIndex of sources.filename) { + expect(filenameIndex).toBeGreaterThanOrEqual(0); + expect(filenameIndex).toBeLessThan(stringTable.getBackingArray().length); + const filename = stringTable.getString(filenameIndex); + expect(filename).toBeString(); + expect(filename.endsWith('.js')).toBe(true); + } + }); + + it('should handle profiles with different UUID patterns', function () { + // Create profiles with sources that have different UUIDs + const profileA = getProfileFromTextSamples(` + A[file:script.js] + `); + + const profileB = getProfileFromTextSamples(` + B[file:script.js] + `); + + // Manually modify the source tables to have UUIDs + profileA.profile.shared.sources.uuid[0] = 'uuid-a'; + profileB.profile.shared.sources.uuid[0] = 'uuid-b'; + + const profileState = stateFromLocation({ + pathname: '/public/fakehash1/', + search: '?thread=0&v=3', + hash: '', + }); + + const { profile: mergedProfile } = mergeProfilesForDiffing( + [profileA.profile, profileB.profile], + [profileState, profileState] + ); + + const { sources } = mergedProfile.shared; + const stringTable = StringTable.withBackingArray( + mergedProfile.shared.stringArray + ); + + // Should have two separate entries for the same filename with different UUIDs + const sourceFilenames = sources.filename.map((index) => + stringTable.getString(index) + ); + + expect(sources.length).toBe(2); + expect(sourceFilenames.filter((name) => name === 'script.js')).toHaveLength( + 2 + ); + expect(sources.uuid).toHaveLength(2); + expect(sources.uuid).toEqual(expect.arrayContaining(['uuid-a', 'uuid-b'])); + + // Both should point to the same filename string + const filenameIndexes = sources.filename; + expect(stringTable.getString(filenameIndexes[0])).toBe('script.js'); + expect(stringTable.getString(filenameIndexes[1])).toBe('script.js'); + }); + + it('should correctly update funcTable source references after merging', function () { + const profileA = getProfileFromTextSamples(` + A[file:first.js] + B[file:second.js] + `); + + const profileB = getProfileFromTextSamples(` + C[file:second.js] + D[file:third.js] + `); + + const profileState = stateFromLocation({ + pathname: '/public/fakehash1/', + search: '?thread=0&v=3', + hash: '', + }); + + const { profile: mergedProfile } = mergeProfilesForDiffing( + [profileA.profile, profileB.profile], + [profileState, profileState] + ); + + // Check that all threads have valid source references + for (const thread of mergedProfile.threads) { + for (let i = 0; i < thread.funcTable.length; i++) { + const sourceIndex = thread.funcTable.source[i]; + // Source index should be valid + expect(sourceIndex).not.toBeNull(); + expect(sourceIndex).toBeGreaterThanOrEqual(0); + expect(sourceIndex).toBeLessThan(mergedProfile.shared.sources.length); + + // Should reference a valid filename in the string table + const filenameIndex = + mergedProfile.shared.sources.filename[ensureExists(sourceIndex)]; + expect(filenameIndex).toBeGreaterThanOrEqual(0); + expect(filenameIndex).toBeLessThan( + mergedProfile.shared.stringArray.length + ); + } + } + }); + + it('should preserve source information in empty profiles', function () { + // Create minimal empty profiles manually since getProfileFromTextSamples doesn't handle empty strings + const emptyProfileA = getProfileFromTextSamples('A').profile; + const emptyProfileB = getProfileFromTextSamples('B').profile; + + // Clear the threads to make them effectively empty + emptyProfileA.threads[0].samples.length = 0; + emptyProfileA.threads[0].samples.stack = []; + emptyProfileB.threads[0].samples.length = 0; + emptyProfileB.threads[0].samples.stack = []; + + const profileState = stateFromLocation({ + pathname: '/public/fakehash1/', + search: '?thread=0&v=3', + hash: '', + }); + + const { profile: mergedProfile } = mergeProfilesForDiffing( + [emptyProfileA, emptyProfileB], + [profileState, profileState] + ); + + // Should still have some sources from the profile structure + expect(mergedProfile.shared.sources.filename).toBeArray(); + expect(mergedProfile.shared.sources.uuid).toBeArray(); + expect(mergedProfile.shared.sources.length).toBeNumber(); + expect(mergedProfile.shared.sources.length).toBeGreaterThanOrEqual(0); + }); + + it('should handle single profile merge correctly', function () { + const singleProfile = getProfileFromTextSamples(` + A[file:single.js] + B[file:single.js] + `); + + const originalSourcesLength = singleProfile.profile.shared.sources.length; + + const profileState = stateFromLocation({ + pathname: '/public/fakehash1/', + search: '?thread=0&v=3', + hash: '', + }); + + const { profile: mergedProfile } = mergeProfilesForDiffing( + [singleProfile.profile], + [profileState] + ); + + // Should preserve original source table + expect(mergedProfile.shared.sources.length).toBe(originalSourcesLength); + expect(mergedProfile.shared.sources).toEqual( + singleProfile.profile.shared.sources + ); + }); +}); diff --git a/src/test/unit/process-profile.test.ts b/src/test/unit/process-profile.test.ts index f3cf45ed6f..5844b04eb1 100644 --- a/src/test/unit/process-profile.test.ts +++ b/src/test/unit/process-profile.test.ts @@ -6,8 +6,8 @@ import { processGeckoProfile, serializeProfile, unserializeProfileOfArbitraryFormat, - GlobalDataCollector, } from '../../profile-logic/process-profile'; +import { GlobalDataCollector } from 'firefox-profiler/profile-logic/global-data-collector'; import { computeTimeColumnForRawSamplesTable } from '../../profile-logic/profile-data'; import { StringTable } from '../../utils/string-table'; import { @@ -112,9 +112,13 @@ describe('extract functions and resource from location strings', function () { geckoThreadStringArray, libs, extensions, - globalDataCollector + globalDataCollector, + undefined ); + const { + shared: { sources }, + } = globalDataCollector.finish(); const stringTable = globalDataCollector.getStringTable(); expect( @@ -125,7 +129,9 @@ describe('extract functions and resource from location strings', function () { const funcName = stringTable.getString(funcTable.name[funcIndex]); const resourceIndex = funcTable.resource[funcIndex]; const isJS = funcTable.isJS[funcIndex]; - const fileNameIndex = funcTable.fileName[funcIndex]; + const sourceIndex = funcTable.source[funcIndex]; + const fileNameIndex = + sourceIndex !== null ? sources.filename[sourceIndex] : null; const fileName = fileNameIndex === null ? null : stringTable.getString(fileNameIndex); const lineNumber = funcTable.lineNumber[funcIndex]; @@ -891,3 +897,112 @@ describe('visualMetrics processing', function () { ); }); }); + +describe('source table processing', function () { + it('should create a global source table during profile processing', function () { + const geckoProfile = createGeckoProfile(); + const processedProfile = processGeckoProfile(geckoProfile); + + // Check that the global source table has the expected structure + expect(processedProfile.shared.sources.filename).toBeArray(); + expect(processedProfile.shared.sources.uuid).toBeArray(); + expect(processedProfile.shared.sources.length).toBeNumber(); + + // Check that source indexes are consistent + expect(processedProfile.shared.sources.filename.length).toBe( + processedProfile.shared.sources.length + ); + expect(processedProfile.shared.sources.uuid.length).toBe( + processedProfile.shared.sources.length + ); + + // Should have at least one source from the test profile + expect(processedProfile.shared.sources.length).toBeGreaterThan(0); + + // All filename indexes should be valid string table indexes + for (const filenameIndex of processedProfile.shared.sources.filename) { + expect(filenameIndex).toBeGreaterThanOrEqual(0); + expect(filenameIndex).toBeLessThan( + processedProfile.shared.stringArray.length + ); + } + }); + + it('should properly construct the source references', function () { + const geckoProfile = createGeckoProfile(); + const processedProfile = processGeckoProfile(geckoProfile); + + // Check that all threads have correct funcTable.source values + expect(processedProfile.threads.length).toBeGreaterThan(0); + for (const thread of processedProfile.threads) { + expect(thread.funcTable.source).toBeArray(); + + // Should have at least some functions in the test profile + expect(thread.funcTable.length).toBeGreaterThan(0); + + // Verify that source indexes are valid + for (let i = 0; i < thread.funcTable.length; i++) { + const sourceIndex = thread.funcTable.source[i]; + if (sourceIndex === null) { + // Skip the native functions that don't have sources yet. They are + // added during symbolication. + continue; + } + + expect(sourceIndex).toBeGreaterThanOrEqual(0); + expect(sourceIndex).toBeLessThan( + processedProfile.shared.sources.length + ); + + // Verify that the source points to a valid filename + const filenameIndex = + processedProfile.shared.sources.filename[sourceIndex]; + expect(filenameIndex).toBeGreaterThanOrEqual(0); + expect(filenameIndex).toBeLessThan( + processedProfile.shared.stringArray.length + ); + + // Verify the filename string is not empty + const filename = processedProfile.shared.stringArray[filenameIndex]; + expect(filename).toBeString(); + expect(filename.length).toBeGreaterThan(0); + } + } + }); + + it('should handle sources with null UUIDs correctly', function () { + const geckoProfile = createGeckoProfile(); + const processedProfile = processGeckoProfile(geckoProfile); + + // Most sources in the test profile should have null UUIDs + const { sources } = processedProfile.shared; + for (let i = 0; i < sources.length; i++) { + // UUIDs can be null or string + expect( + sources.uuid[i] === null || typeof sources.uuid[i] === 'string' + ).toBe(true); + } + }); + + it('should deduplicate sources with same filename and UUID', function () { + const geckoProfile = createGeckoProfile(); + const processedProfile = processGeckoProfile(geckoProfile); + + // Count unique source files - verify no exact duplicates exist + const { sources } = processedProfile.shared; + const filenameSet = new Set(); + + for (let i = 0; i < sources.length; i++) { + const filename = processedProfile.shared.stringArray[sources.filename[i]]; + const uuid = sources.uuid[i]; + const key = `${filename}:${uuid}`; + + // Should not have exact duplicates + expect(filenameSet.has(key)).toBe(false); + filenameSet.add(key); + } + + // The test profile should have at least one source + expect(sources.length).toBeGreaterThan(0); + }); +}); diff --git a/src/test/unit/profile-data.test.ts b/src/test/unit/profile-data.test.ts index 80bd0a3bb1..1d4a47ec5b 100644 --- a/src/test/unit/profile-data.test.ts +++ b/src/test/unit/profile-data.test.ts @@ -58,6 +58,7 @@ import type { RawThread, RawProfileSharedData, IndexIntoFrameTable, + IndexIntoSourceTable, } from 'firefox-profiler/types'; describe('string-table', function () { @@ -261,10 +262,12 @@ describe('process-profile', function () { expect(funcTableNames[2]).toEqual('0x100001a45'); expect(funcTableNames[3]).toEqual('Startup::XRE_Main'); expect(funcTableNames[4]).toEqual('frobnicate'); - const chromeStringIndex = thread.funcTable.fileName[4]; - if (typeof chromeStringIndex !== 'number') { - throw new Error('chromeStringIndex must be a number'); + const chromeSourceIndex = thread.funcTable.source[4]; + if (typeof chromeSourceIndex !== 'number') { + throw new Error('chromeSourceIndex must be a number'); } + const chromeStringIndex = + profile.shared.sources.filename[chromeSourceIndex]; expect(shared.stringArray[chromeStringIndex]).toEqual('chrome://blargh'); expect(thread.funcTable.lineNumber[4]).toEqual(34); expect(thread.funcTable.columnNumber[4]).toEqual(35); @@ -1378,9 +1381,20 @@ describe('findAddressProofForFile', function () { webrender::renderer::shade::LazilyCompiledShader::bind[lib:XUL][file:/Users/mstange/code/mozilla/gfx/wr/webrender/src/renderer/shade.rs][line:150][address:4a9f89b] `); + const getSourceIndex = (sourceFile: string): IndexIntoSourceTable => { + const stringTable = StringTable.withBackingArray( + profile.shared.stringArray + ); + + const sourceFileIndex = stringTable.indexForString(sourceFile); + return profile.shared.sources.filename.indexOf(sourceFileIndex); + }; + const addressProof1 = findAddressProofForFile( profile, - '/Users/mstange/code/mozilla/gfx/wr/webrender/src/renderer/mod.rs' + getSourceIndex( + '/Users/mstange/code/mozilla/gfx/wr/webrender/src/renderer/mod.rs' + ) ); expect(addressProof1).toEqual({ debugName: 'XUL', @@ -1390,7 +1404,9 @@ describe('findAddressProofForFile', function () { const addressProof2 = findAddressProofForFile( profile, - '/Users/mstange/code/mozilla/gfx/wr/webrender/src/renderer/shade.rs' + getSourceIndex( + '/Users/mstange/code/mozilla/gfx/wr/webrender/src/renderer/shade.rs' + ) ); expect(addressProof2).toEqual({ debugName: 'XUL', @@ -1400,7 +1416,9 @@ describe('findAddressProofForFile', function () { const missingAddressProof = findAddressProofForFile( profile, - '/Users/mstange/code/mozilla/xpcom/threads/nsThreadUtils.cpp' + getSourceIndex( + '/Users/mstange/code/mozilla/xpcom/threads/nsThreadUtils.cpp' + ) ); expect(missingAddressProof).toBeNull(); }); diff --git a/src/test/unit/profile-tree.test.ts b/src/test/unit/profile-tree.test.ts index 0ea503721f..4b4c70d513 100644 --- a/src/test/unit/profile-tree.test.ts +++ b/src/test/unit/profile-tree.test.ts @@ -25,6 +25,7 @@ import { functionListTreeFromProfile, formatTree, formatTreeIncludeCategories, + addSourceToTable, } from '../fixtures/utils'; import { ensureExists } from 'firefox-profiler/utils/types'; import type { CallNodePath } from 'firefox-profiler/types'; @@ -669,9 +670,7 @@ describe('diffing trees', function () { describe('origin annotation', function () { const { - profile: { - threads: [thread], - }, + profile, stringTable, funcNamesPerThread: [funcNames], } = getProfileFromTextSamples(` @@ -680,6 +679,9 @@ describe('origin annotation', function () { C D `); + const { + threads: [thread], + } = profile; function addResource( funcName: string, @@ -690,8 +692,11 @@ describe('origin annotation', function () { const resourceIndex = thread.resourceTable.length; const funcIndex = funcNames.indexOf(funcName); thread.funcTable.resource[funcIndex] = resourceIndex; - thread.funcTable.fileName[funcIndex] = location - ? stringTable.indexForString(location) + thread.funcTable.source[funcIndex] = location + ? addSourceToTable( + profile.shared.sources, + stringTable.indexForString(location) + ) : null; thread.resourceTable.lib.push(-1); thread.resourceTable.name.push(stringTable.indexForString(name)); @@ -724,7 +729,8 @@ describe('origin annotation', function () { funcNames.indexOf(funcName), thread.funcTable, thread.resourceTable, - stringTable + stringTable, + profile.shared.sources ); } diff --git a/src/test/unit/query-api.test.ts b/src/test/unit/query-api.test.ts index 8bc98d07cc..f760d7bc35 100644 --- a/src/test/unit/query-api.test.ts +++ b/src/test/unit/query-api.test.ts @@ -29,6 +29,12 @@ describe('queryApiWithFallback', function () { throw new Error('Not implemented'); }) ), + fetchJSSourceFromBrowser: jest.fn( + overrides.fetchJSSourceFromBrowser ?? + (async () => { + throw new Error('Not implemented'); + }) + ), }; } @@ -271,6 +277,7 @@ describe('RegularExternalCommunicationDelegate', function () { getSymbolTable: jest.fn(bcOverrides.getSymbolTable), getPageFavicons: jest.fn(bcOverrides.getPageFavicons), showFunctionInDevtools: jest.fn(bcOverrides.showFunctionInDevtools), + getJSSource: jest.fn(bcOverrides.getJSSource), } : null; diff --git a/src/test/unit/sanitize.test.ts b/src/test/unit/sanitize.test.ts index c912c9dcc0..e51be4d509 100644 --- a/src/test/unit/sanitize.test.ts +++ b/src/test/unit/sanitize.test.ts @@ -1206,4 +1206,57 @@ describe('sanitizePII', function () { ]); }); }); + + it('should compact the source table when threads are removed', function () { + // Create a profile with multiple threads that reference different sources + const { profile } = getProfileFromTextSamples( + `A[file:file1.js]`, + `B[file:file2.js]`, + `C[file:file3.js]` + ); + + const originalSourcesLength = profile.shared.sources.length; + + // Verify we have sources for each thread + expect(originalSourcesLength).toEqual(3); + + // Verify that different threads reference different sources + const thread0SourceIndex = profile.threads[0].funcTable.source[0]; + const thread1SourceIndex = profile.threads[1].funcTable.source[0]; + const thread2SourceIndex = profile.threads[2].funcTable.source[0]; + + expect(thread0SourceIndex).not.toBe(thread1SourceIndex); + expect(thread1SourceIndex).not.toBe(thread2SourceIndex); + + // Remove threads 0 and 2, keeping only thread 1. + const { sanitizedProfile } = setup( + { + shouldRemoveThreads: new Set([0, 2]), + }, + profile + ); + + // The source table should be compacted to only contain sources referenced + // by remaining threads + expect(sanitizedProfile.shared.sources.length).toBeLessThan( + originalSourcesLength + ); + expect(sanitizedProfile.shared.sources.length).toEqual(1); + + // The remaining thread should still have a valid source reference + const remainingSourceIndex = + sanitizedProfile.threads[0].funcTable.source[0]; + expect(remainingSourceIndex).not.toBeNull(); + expect(remainingSourceIndex).toBeLessThan( + sanitizedProfile.shared.sources.length + ); + + // Verify that the filename string is still accessible + expect(remainingSourceIndex).not.toBeNull(); + const filenameStringIndex = + sanitizedProfile.shared.sources.filename[remainingSourceIndex!]; + expect(sanitizedProfile.shared.stringArray[filenameStringIndex]).toContain( + 'file2.js' + ); + }); }); diff --git a/src/test/unit/source-code-cache.test.ts b/src/test/unit/source-code-cache.test.ts new file mode 100644 index 0000000000..26100e117f --- /dev/null +++ b/src/test/unit/source-code-cache.test.ts @@ -0,0 +1,168 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import { getSourceViewCode, getSourceCodeCache } from '../../selectors/code'; +import { storeWithProfile } from '../fixtures/stores'; +import { updateUrlState } from '../../actions/app'; +import { stateFromLocation } from '../../app-logic/url-handling'; +import { + beginLoadingSourceCodeFromUrl, + beginLoadingSourceCodeFromBrowserConnection, + finishLoadingSourceCode, + failLoadingSourceCode, +} from '../../actions/code'; + +import type { IndexIntoSourceTable } from 'firefox-profiler/types'; + +describe('source code cache with IndexIntoSourceTable', function () { + function setupStoreWithSourceIndex(sourceIndex: IndexIntoSourceTable | null) { + const store = storeWithProfile(); + if (sourceIndex !== null) { + const urlState = stateFromLocation({ + pathname: '/public/fakehash/', + search: `?sourceViewIndex=${sourceIndex}`, + hash: '', + }); + store.dispatch(updateUrlState(urlState)); + } + return store; + } + + it('returns undefined when no source code is cached', function () { + const { getState } = setupStoreWithSourceIndex(0); + const sourceViewCode = getSourceViewCode(getState()); + expect(sourceViewCode).toBeUndefined(); + }); + + it('returns undefined when sourceIndex is null', function () { + const { getState } = setupStoreWithSourceIndex(null); + const sourceViewCode = getSourceViewCode(getState()); + expect(sourceViewCode).toBeUndefined(); + }); + + it('returns undefined when sourceIndex is not in cache', function () { + const { getState, dispatch } = setupStoreWithSourceIndex(999); + // Add some other source to cache but not index 999 + dispatch(finishLoadingSourceCode(0, 'some code')); + + const sourceViewCode = getSourceViewCode(getState()); + expect(sourceViewCode).toBeUndefined(); + }); + + it('retrieves cached source code for AVAILABLE status', function () { + const { getState, dispatch } = setupStoreWithSourceIndex(0); + dispatch(finishLoadingSourceCode(0, 'console.log("Source 0");')); + + const sourceViewCode = getSourceViewCode(getState()); + expect(sourceViewCode).toEqual({ + type: 'AVAILABLE', + code: 'console.log("Source 0");', + }); + }); + + it('retrieves cached source code for LOADING status with URL', function () { + const { getState, dispatch } = setupStoreWithSourceIndex(2); + dispatch( + beginLoadingSourceCodeFromUrl(2, 'https://example.com/source2.js') + ); + + const sourceViewCode = getSourceViewCode(getState()); + expect(sourceViewCode).toEqual({ + type: 'LOADING', + source: { type: 'URL', url: 'https://example.com/source2.js' }, + }); + }); + + it('retrieves cached source code for ERROR status', function () { + const { getState, dispatch } = setupStoreWithSourceIndex(3); + dispatch( + failLoadingSourceCode(3, [ + { + type: 'NETWORK_ERROR', + url: 'https://example.com/source3.js', + networkErrorMessage: 'Failed to fetch', + }, + ]) + ); + + const sourceViewCode = getSourceViewCode(getState()); + expect(sourceViewCode).toEqual({ + type: 'ERROR', + errors: [ + { + type: 'NETWORK_ERROR', + url: 'https://example.com/source3.js', + networkErrorMessage: 'Failed to fetch', + }, + ], + }); + }); + + it('retrieves cached source code for LOADING status with BROWSER_CONNECTION', function () { + const { getState, dispatch } = setupStoreWithSourceIndex(4); + dispatch(beginLoadingSourceCodeFromBrowserConnection(4)); + + const sourceViewCode = getSourceViewCode(getState()); + expect(sourceViewCode).toEqual({ + type: 'LOADING', + source: { type: 'BROWSER_CONNECTION' }, + }); + }); + + describe('getSourceCodeCache selector', function () { + it('returns the cache Map with cached entries', function () { + const { getState, dispatch } = setupStoreWithSourceIndex(null); + dispatch(finishLoadingSourceCode(0, 'console.log("Source 0");')); + + const result = getSourceCodeCache(getState()); + expect(result).toBeInstanceOf(Map); + expect(result.get(0)).toEqual({ + type: 'AVAILABLE', + code: 'console.log("Source 0");', + }); + }); + + it('returns empty Map when no cache is set', function () { + const { getState } = setupStoreWithSourceIndex(null); + + const result = getSourceCodeCache(getState()); + expect(result).toBeInstanceOf(Map); + expect(result.size).toBe(0); + }); + }); + + describe('state transitions', function () { + it('can transition from LOADING to AVAILABLE', function () { + const { getState, dispatch } = setupStoreWithSourceIndex(0); + dispatch(beginLoadingSourceCodeFromUrl(0, 'https://example.com/test.js')); + + let sourceViewCode = getSourceViewCode(getState()); + expect(sourceViewCode?.type).toBe('LOADING'); + + dispatch(finishLoadingSourceCode(0, 'const result = 42;')); + + sourceViewCode = getSourceViewCode(getState()); + expect(sourceViewCode).toEqual({ + type: 'AVAILABLE', + code: 'const result = 42;', + }); + }); + + it('can transition from LOADING to ERROR', function () { + const { getState, dispatch } = setupStoreWithSourceIndex(1); + dispatch(beginLoadingSourceCodeFromUrl(1, 'https://example.com/test.js')); + + let sourceViewCode = getSourceViewCode(getState()); + expect(sourceViewCode?.type).toBe('LOADING'); + + dispatch(failLoadingSourceCode(1, [{ type: 'NO_KNOWN_CORS_URL' }])); + + sourceViewCode = getSourceViewCode(getState()); + expect(sourceViewCode).toEqual({ + type: 'ERROR', + errors: [{ type: 'NO_KNOWN_CORS_URL' }], + }); + }); + }); +}); diff --git a/src/test/url-handling.test.ts b/src/test/url-handling.test.ts index f8fffa76af..eb692cfb23 100644 --- a/src/test/url-handling.test.ts +++ b/src/test/url-handling.test.ts @@ -38,6 +38,7 @@ import type { Store, State, ThreadIndex, + IndexIntoSourceTable, } from 'firefox-profiler/types'; import getNiceProfile from './fixtures/profiles/call-nodes'; import queryString from 'query-string'; @@ -54,6 +55,7 @@ import { import { getProfile } from '../selectors/profile'; import { SYMBOL_SERVER_URL } from '../app-logic/constants'; import { getThreadsKey } from '../profile-logic/profile-data'; +import { StringTable } from 'firefox-profiler/utils/string-table'; type StoreUrlSettings = { pathname?: string; @@ -1771,21 +1773,33 @@ describe('symbolServerUrl', function () { describe('URL persistence of bottom box (source view and assembly view)', function () { function setup() { const store = _getStoreWithURL(); - return store; + + const getSourceIndex = (sourceFile: string): IndexIntoSourceTable => { + const profile = getProfile(store.getState()); + const stringTable = StringTable.withBackingArray( + profile.shared.stringArray + ); + + const sourceFileIndex = stringTable.indexForString(sourceFile); + return profile.shared.sources.filename.indexOf(sourceFileIndex); + }; + + return { ...store, getSourceIndex }; } it('persists the source file shown in the source view to the URL', function () { - const { dispatch, getState } = setup(); + const { dispatch, getState, getSourceIndex } = setup(); expect(urlStateSelectors.getSelectedTab(getState())).toBe('calltree'); expect(urlStateSelectors.getIsBottomBoxOpen(getState())).toBeFalse(); - expect(urlStateSelectors.getSourceViewFile(getState())).toBeNull(); + expect(urlStateSelectors.getSourceViewSourceIndex(getState())).toBeNull(); // Open the source view for 'xpcom/threads/nsThread.cpp'. const sourceFile = 'hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:5bb3e281dc9ec8a619c781d52882adb1cacf20bb'; + const sourceIndex = getSourceIndex(sourceFile); const bottomBoxInfo = { libIndex: 0, - sourceFile, + sourceIndex, nativeSymbols: [], }; dispatch(updateBottomBoxContentsAndMaybeOpen('calltree', bottomBoxInfo)); @@ -1794,9 +1808,9 @@ describe('URL persistence of bottom box (source view and assembly view)', functi expect( urlStateSelectors.getIsBottomBoxOpen(newStore.getState()) ).toBeTrue(); - expect(urlStateSelectors.getSourceViewFile(newStore.getState())).toBe( - sourceFile - ); + expect( + urlStateSelectors.getSourceViewSourceIndex(newStore.getState()) + ).toBe(sourceIndex); expect( urlStateSelectors.getAssemblyViewIsOpen(newStore.getState()) ).toBeFalse(); @@ -1806,17 +1820,18 @@ describe('URL persistence of bottom box (source view and assembly view)', functi }); it('keeps a closed bottom box closed, even if a source file was loaded before', function () { - const { dispatch, getState } = setup(); + const { dispatch, getState, getSourceIndex } = setup(); expect(urlStateSelectors.getSelectedTab(getState())).toBe('calltree'); expect(urlStateSelectors.getIsBottomBoxOpen(getState())).toBeFalse(); - expect(urlStateSelectors.getSourceViewFile(getState())).toBeNull(); + expect(urlStateSelectors.getSourceViewSourceIndex(getState())).toBeNull(); // Open the source view for 'xpcom/threads/nsThread.cpp'. const sourceFile = 'hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:5bb3e281dc9ec8a619c781d52882adb1cacf20bb'; + const sourceIndex = getSourceIndex(sourceFile); const bottomBoxInfo = { libIndex: 0, - sourceFile, + sourceIndex, nativeSymbols: [], }; dispatch(updateBottomBoxContentsAndMaybeOpen('calltree', bottomBoxInfo)); @@ -1844,7 +1859,7 @@ describe('URL persistence of bottom box (source view and assembly view)', functi }; const bottomBoxInfo = { libIndex: 0, - sourceFile: null, + sourceIndex: null, nativeSymbols: [nativeSymbolInfo], }; dispatch(updateBottomBoxContentsAndMaybeOpen('calltree', bottomBoxInfo)); @@ -1862,10 +1877,10 @@ describe('URL persistence of bottom box (source view and assembly view)', functi }); it('only opens the assembly view on reload if it was open before', function () { - const { dispatch, getState } = setup(); + const { dispatch, getState, getSourceIndex } = setup(); expect(urlStateSelectors.getSelectedTab(getState())).toBe('calltree'); expect(urlStateSelectors.getIsBottomBoxOpen(getState())).toBeFalse(); - expect(urlStateSelectors.getSourceViewFile(getState())).toBeNull(); + expect(urlStateSelectors.getSourceViewSourceIndex(getState())).toBeNull(); expect(urlStateSelectors.getAssemblyViewIsOpen(getState())).toBeFalse(); // Open the source view for 'xpcom/threads/nsThread.cpp' and initialize the @@ -1876,6 +1891,7 @@ describe('URL persistence of bottom box (source view and assembly view)', functi // closed even if we have a native symbol. const sourceFile = 'hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:5bb3e281dc9ec8a619c781d52882adb1cacf20bb'; + const sourceIndex = getSourceIndex(sourceFile); const nativeSymbolInfo = { libIndex: 0, name: 'MySymbol', @@ -1885,7 +1901,7 @@ describe('URL persistence of bottom box (source view and assembly view)', functi }; const bottomBoxInfo = { libIndex: 0, - sourceFile: sourceFile, + sourceIndex, nativeSymbols: [nativeSymbolInfo], }; dispatch(updateBottomBoxContentsAndMaybeOpen('calltree', bottomBoxInfo)); @@ -1894,9 +1910,9 @@ describe('URL persistence of bottom box (source view and assembly view)', functi expect( urlStateSelectors.getIsBottomBoxOpen(newStore.getState()) ).toBeTrue(); - expect(urlStateSelectors.getSourceViewFile(newStore.getState())).toBe( - sourceFile - ); + expect( + urlStateSelectors.getSourceViewSourceIndex(newStore.getState()) + ).toBe(sourceIndex); // The assembly view should remain closed. expect( urlStateSelectors.getAssemblyViewIsOpen(newStore.getState()) diff --git a/src/types/actions.ts b/src/types/actions.ts index ddd300f9fa..9f6768b75d 100644 --- a/src/types/actions.ts +++ b/src/types/actions.ts @@ -12,6 +12,7 @@ import type { IndexIntoCategoryList, IndexIntoLibs, PageList, + IndexIntoSourceTable, } from './profile'; import type { Thread, @@ -336,7 +337,7 @@ type ProfileAction = | { readonly type: 'UPDATE_BOTTOM_BOX'; readonly libIndex: IndexIntoLibs | null; - readonly sourceFile: string | null; + readonly sourceIndex: IndexIntoSourceTable | null; readonly nativeSymbol: NativeSymbolInfo | null; readonly allNativeSymbolsForInitiatingCallNode: NativeSymbolInfo[]; readonly currentTab: TabSlug; @@ -598,8 +599,23 @@ type SidebarAction = { type PublishAction = | { - readonly type: 'TOGGLE_CHECKED_SHARING_OPTION'; + readonly type: 'UPDATE_SHARING_OPTION'; readonly slug: keyof CheckedSharingOptions; + readonly value: boolean; + } + | { + readonly type: 'SANITIZED_PROFILE_ENCODING_STARTED'; + readonly sanitizedProfile: Profile; + } + | { + readonly type: 'SANITIZED_PROFILE_ENCODING_COMPLETED'; + readonly sanitizedProfile: Profile; + readonly profileData: Blob; + } + | { + readonly type: 'SANITIZED_PROFILE_ENCODING_FAILED'; + readonly sanitizedProfile: Profile; + readonly error: Error; } | { readonly type: 'UPLOAD_STARTED'; @@ -654,21 +670,21 @@ type CurrentProfileUploadedInformationAction = { type SourcesAction = | { readonly type: 'SOURCE_CODE_LOADING_BEGIN_URL'; - readonly file: string; + readonly sourceIndex: IndexIntoSourceTable; readonly url: string; } | { readonly type: 'SOURCE_CODE_LOADING_BEGIN_BROWSER_CONNECTION'; - readonly file: string; + readonly sourceIndex: IndexIntoSourceTable; } | { readonly type: 'SOURCE_CODE_LOADING_SUCCESS'; - readonly file: string; + readonly sourceIndex: IndexIntoSourceTable; readonly code: string; } | { readonly type: 'SOURCE_CODE_LOADING_ERROR'; - readonly file: string; + readonly sourceIndex: IndexIntoSourceTable; readonly errors: SourceCodeLoadingError[]; }; diff --git a/src/types/gecko-profile.ts b/src/types/gecko-profile.ts index 98fbd8a845..7d1be14d87 100644 --- a/src/types/gecko-profile.ts +++ b/src/types/gecko-profile.ts @@ -548,6 +548,28 @@ export type ProfilingLog = { [pid: number]: ProcessProfilingLog; }; +/** + * Table containing source code file references in the Gecko profile format. + * Each entry maps a unique UUID to a filename, allowing frames to reference + * their source files for displaying source code context in the profiler UI. + * This table is optional and only present in newer Firefox versions. + * + * Note: In Gecko profiles, this table only contains sources for JavaScript code. + * The processed profile format expands this to include native code sources as well. + */ +export type GeckoSourceTable = { + schema: { + uuid: 0; + filename: 1; + }; + data: Array< + [ + string, // UUID for the source + string, // Filename of the source + ] + >; +}; + export type GeckoProfileWithMeta = { counters?: GeckoCounter[]; // Optional because older Firefox versions may not have that data and @@ -556,6 +578,8 @@ export type GeckoProfileWithMeta = { meta: Meta; libs: LibMapping[]; pages?: PageList; + // Optional because older Firefox versions may not have this table. + sources?: GeckoSourceTable; threads: GeckoThread[]; pausedRanges: PausedRange[]; processes: GeckoSubprocessProfile[]; diff --git a/src/types/profile-derived.ts b/src/types/profile-derived.ts index b2e444deea..af23ef1028 100644 --- a/src/types/profile-derived.ts +++ b/src/types/profile-derived.ts @@ -32,6 +32,8 @@ import type { WeightType, IndexIntoFrameTable, IndexIntoSubcategoryListForCategory, + SourceTable, + IndexIntoSourceTable, } from './profile'; import type { IndexedArray } from './utils'; import type { BitSet } from '../utils/bitset'; @@ -100,6 +102,9 @@ export type Thread = { // Strings for profiles are collected into a single table, and are referred to by // their index by other tables. stringTable: StringTable; + // Sources for profiles are collected into a single table, containing file sources + // with their UUIDs and filenames. + sources: SourceTable; // The stack samples collected for this thread. This field is different from // RawThread in that the `time` column is always present. samples: SamplesTable; @@ -768,7 +773,7 @@ export type NativeSymbolInfo = { */ export type BottomBoxInfo = { libIndex: IndexIntoLibs | null; - sourceFile: string | null; + sourceIndex: IndexIntoSourceTable | null; nativeSymbols: NativeSymbolInfo[]; }; diff --git a/src/types/profile.ts b/src/types/profile.ts index 645b21779e..90460a31a5 100644 --- a/src/types/profile.ts +++ b/src/types/profile.ts @@ -17,6 +17,7 @@ export type IndexIntoLibs = number; export type IndexIntoNativeSymbolTable = number; export type IndexIntoCategoryList = number; export type IndexIntoSubcategoryListForCategory = number; +export type IndexIntoSourceTable = number; export type ResourceTypeEnum = number; export type ThreadIndex = number; // The Tid is most often a number. However in some cases such as merged profiles @@ -331,7 +332,7 @@ export type FuncTable = { // location of the *start* of the JS function. As for the information about which // which lines / columns inside the function were actually hit during execution, // that information is stored in the frameTable, not in the funcTable. - fileName: Array; + source: Array; lineNumber: Array; columnNumber: Array; @@ -921,10 +922,27 @@ export type ProfileMeta = { gramsOfCO2ePerKWh?: number; }; +/** + * Table containing source code file references in the processed profile format. + * Maps UUIDs to filenames for JavaScript sources, while native code sources + * have null UUIDs. Native code sources are added during the symbolication process. + * This allows the profiler to display source code context when viewing frames. + * This is an expanded version of GeckoSourceTable that includes native code sources + * in addition to JavaScript sources. + */ +export type SourceTable = { + length: number; + uuid: Array; + filename: Array; +}; + export type RawProfileSharedData = { // Strings for profiles are collected into a single table, and are referred to by // their index by other tables. stringArray: string[]; + // Optional sources table for JS source UUID to URL mapping. + // Added for UUID-based source fetching. + sources: SourceTable; }; /** diff --git a/src/types/state.ts b/src/types/state.ts index 7c35e49936..08df9b8213 100644 --- a/src/types/state.ts +++ b/src/types/state.ts @@ -22,6 +22,7 @@ import type { Pid, TabID, IndexIntoLibs, + IndexIntoSourceTable, } from './profile'; import type { @@ -204,8 +205,21 @@ export type UploadState = { generation: number; }; +export type SanitizedProfileEncodingState = + | { + phase: 'INITIAL'; + } + | { phase: 'ENCODING'; sanitizedProfile: Profile } + | { + phase: 'DONE'; + sanitizedProfile: Profile; + profileData: Blob; + } + | { phase: 'ERROR'; sanitizedProfile: Profile; error: Error }; + export type PublishState = { readonly checkedSharingOptions: CheckedSharingOptions; + readonly sanitizedProfileEncodingState: SanitizedProfileEncodingState; readonly upload: UploadState; readonly isHidingStaleProfile: boolean; readonly hasSanitizedProfile: boolean; @@ -230,9 +244,9 @@ export type SourceViewState = { // for example if the source view was opened via the URL (the source URL param // currently discards the libIndex). libIndex: IndexIntoLibs | null; - // The path to the source file. Null if a function without a file path was - // double clicked. - sourceFile: string | null; + // Index into source table. Contains information (filename and uuid) about the + // source. Null if a function without a file path was double clicked. + sourceIndex: IndexIntoSourceTable | null; }; export type AssemblyViewState = { @@ -316,6 +330,12 @@ export type SourceCodeLoadingError = type: 'ARCHIVE_PARSING_ERROR'; url: string; parsingErrorMessage: string; + } + | { + type: 'NOT_PRESENT_IN_BROWSER'; + sourceUuid: string; + url: string; + errorMessage: string; }; export type ProfileSpecificUrlState = { @@ -371,7 +391,7 @@ export type PseudoStrategy = null | 'bidi' | 'accented'; export type IconsWithClassNames = Map; export type CodeState = { - readonly sourceCodeCache: Map; + readonly sourceCodeCache: Map; readonly assemblyCodeCache: Map; }; diff --git a/src/utils/fetch-source.ts b/src/utils/fetch-source.ts index b771ce9086..4ad15da0db 100644 --- a/src/utils/fetch-source.ts +++ b/src/utils/fetch-source.ts @@ -28,6 +28,8 @@ export type FetchSourceResult = * then this will call `callbacks.fetchUrlResponse("https://hg.mozilla.org/mozilla-central/raw-file/997f00815e6bc28806b75448c8829f0259d2cb28/widget/cocoa/nsAppShell.mm")`. * * @param file - The path of the file that should be fetched + * @param sourceUUid - The optional UUID of the JS source file that should be + * fetched. It's null for non-JS files. * @param symbolServerUrl - The symbol server URL, used for getting source code * from local servers via the symbolication API /source/v1. * @param addressProof - An "address proof" for the requested file, if known. Otherwise null. @@ -37,6 +39,7 @@ export type FetchSourceResult = */ export async function fetchSource( file: string, + sourceUuid: string | null, symbolServerUrl: string, addressProof: AddressProof | null, archiveCache: Map>, @@ -85,6 +88,27 @@ export async function fetchSource( } } + // Try to obtain the source by downloading a file from the browser if it's a + // JS source. + if (sourceUuid !== null) { + try { + const response = await delegate.fetchJSSourceFromBrowser(sourceUuid); + if (response) { + return { + type: 'SUCCESS', + source: response, + }; + } + } catch (e) { + errors.push({ + type: 'NOT_PRESENT_IN_BROWSER', + sourceUuid, + url: file, + errorMessage: e.toString(), + }); + } + } + // Try to obtain the source by downloading a file from the web. const parsedName = parseFileNameFromSymbolication(file); diff --git a/src/utils/query-api.ts b/src/utils/query-api.ts index ac5798b519..6033f182fe 100644 --- a/src/utils/query-api.ts +++ b/src/utils/query-api.ts @@ -23,6 +23,8 @@ export interface ExternalCommunicationDelegate { path: string, requestJson: string ): Promise; + + fetchJSSourceFromBrowser(source: string): Promise; } export type ApiQueryResult = @@ -160,4 +162,13 @@ export class RegularExternalCommunicationDelegate this._callbacks.onBeginBrowserConnectionQuery(); return browserConnection.querySymbolicationApi(path, requestJson); } + + fetchJSSourceFromBrowser(source: string): Promise { + const browserConnection = this._browserConnection; + if (browserConnection === null) { + throw new Error('No connection to the browser.'); + } + this._callbacks.onBeginBrowserConnectionQuery(); + return browserConnection.getJSSource(source); + } } diff --git a/yarn.lock b/yarn.lock index a76769b140..2cd6d7a71c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -20,14 +20,6 @@ resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.4.0.tgz#728c484f4e10df03d5a3acd0d8adcbbebff8ad63" integrity sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ== -"@ampproject/remapping@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== - dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" - "@apideck/better-ajv-errors@^0.3.1": version "0.3.6" resolved "https://registry.yarnpkg.com/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz#957d4c28e886a64a8141f7522783be65733ff097" @@ -78,31 +70,31 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.0.tgz#9fc6fd58c2a6a15243cd13983224968392070790" integrity sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw== -"@babel/core@^7.23.9", "@babel/core@^7.24.4", "@babel/core@^7.27.4", "@babel/core@^7.28.3": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.3.tgz#aceddde69c5d1def69b839d09efa3e3ff59c97cb" - integrity sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ== +"@babel/core@^7.23.9", "@babel/core@^7.24.4", "@babel/core@^7.27.4", "@babel/core@^7.28.4": + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.4.tgz#12a550b8794452df4c8b084f95003bce1742d496" + integrity sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA== dependencies: - "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.27.1" "@babel/generator" "^7.28.3" "@babel/helper-compilation-targets" "^7.27.2" "@babel/helper-module-transforms" "^7.28.3" - "@babel/helpers" "^7.28.3" - "@babel/parser" "^7.28.3" + "@babel/helpers" "^7.28.4" + "@babel/parser" "^7.28.4" "@babel/template" "^7.27.2" - "@babel/traverse" "^7.28.3" - "@babel/types" "^7.28.2" + "@babel/traverse" "^7.28.4" + "@babel/types" "^7.28.4" + "@jridgewell/remapping" "^2.3.5" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/eslint-parser@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.28.0.tgz#c1b3fbba070f5bac32e3d02f244201add4afdd6e" - integrity sha512-N4ntErOlKvcbTt01rr5wj3y55xnIdx1ymrfIr8C2WnM1Y9glFgWaGDEULJIazOX3XM9NRzhfJ6zZnQ1sBNWU+w== +"@babel/eslint-parser@^7.28.4": + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.28.4.tgz#80dd86e0aeaae9704411a044db60e1ae6477d93f" + integrity sha512-Aa+yDiH87980jR6zvRfFuCR1+dLb00vBydhTL+zI992Rz/wQhSvuxjmOOuJOgO3XmakO6RykRGD2S1mq1AtgHA== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" @@ -269,20 +261,20 @@ "@babel/traverse" "^7.27.1" "@babel/types" "^7.27.1" -"@babel/helpers@^7.28.3": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.3.tgz#b83156c0a2232c133d1b535dd5d3452119c7e441" - integrity sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw== +"@babel/helpers@^7.28.4": + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.4.tgz#fe07274742e95bdf7cf1443593eeb8926ab63827" + integrity sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w== dependencies: "@babel/template" "^7.27.2" - "@babel/types" "^7.28.2" + "@babel/types" "^7.28.4" -"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.27.2", "@babel/parser@^7.28.3": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.3.tgz#d2d25b814621bca5fe9d172bc93792547e7a2a71" - integrity sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA== +"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.27.2", "@babel/parser@^7.28.3", "@babel/parser@^7.28.4": + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.4.tgz#da25d4643532890932cc03f7705fe19637e03fa8" + integrity sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg== dependencies: - "@babel/types" "^7.28.2" + "@babel/types" "^7.28.4" "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.27.1": version "7.27.1" @@ -1035,23 +1027,23 @@ "@babel/parser" "^7.27.2" "@babel/types" "^7.27.1" -"@babel/traverse@^7.27.1", "@babel/traverse@^7.28.0", "@babel/traverse@^7.28.3": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.3.tgz#6911a10795d2cce43ec6a28cffc440cca2593434" - integrity sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ== +"@babel/traverse@^7.27.1", "@babel/traverse@^7.28.0", "@babel/traverse@^7.28.3", "@babel/traverse@^7.28.4": + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.4.tgz#8d456101b96ab175d487249f60680221692b958b" + integrity sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ== dependencies: "@babel/code-frame" "^7.27.1" "@babel/generator" "^7.28.3" "@babel/helper-globals" "^7.28.0" - "@babel/parser" "^7.28.3" + "@babel/parser" "^7.28.4" "@babel/template" "^7.27.2" - "@babel/types" "^7.28.2" + "@babel/types" "^7.28.4" debug "^4.3.1" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.2", "@babel/types@^7.3.0", "@babel/types@^7.4.4": - version "7.28.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.2.tgz#da9db0856a9a88e0a13b019881d7513588cf712b" - integrity sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.2", "@babel/types@^7.28.4", "@babel/types@^7.3.0", "@babel/types@^7.4.4": + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.4.tgz#0a4e618f4c60a7cd6c11cb2d48060e4dbe38ac3a" + integrity sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q== dependencies: "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" @@ -1128,10 +1120,10 @@ dependencies: "@marijn/find-cluster-break" "^1.0.0" -"@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0", "@codemirror/view@^6.38.2": - version "6.38.2" - resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.38.2.tgz#c98aa9f6450a1c95c9744ae8b517600a15a1942f" - integrity sha512-bTWAJxL6EOFLPzTx+O5P5xAO3gTqpatQ2b/ARQ8itfU/v2LlpS3pH2fkL0A3E/Fx8Y2St2KES7ZEV0sHTsSW/A== +"@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0", "@codemirror/view@^6.38.4": + version "6.38.4" + resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.38.4.tgz#1ce72056fa8bdde99c1513fead6951167897d6e5" + integrity sha512-hduz0suCcUSC/kM8Fq3A9iLwInJDl8fD1xLpTIk+5xkNm8z/FT7UsIa9sOXrkpChh+XXc18RzswE8QqELsVl+g== dependencies: "@codemirror/state" "^6.5.0" crelt "^1.0.6" @@ -1181,10 +1173,10 @@ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz#f13c7c205915eb91ae54c557f5e92bddd8be0e83" integrity sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ== -"@dual-bundle/import-meta-resolve@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz#519c1549b0e147759e7825701ecffd25e5819f7b" - integrity sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg== +"@dual-bundle/import-meta-resolve@^4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.2.1.tgz#cd0b25b3808cd9e684cd6cd549bbf8e1dcf05ee7" + integrity sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg== "@emnapi/core@^1.4.3": version "1.4.3" @@ -1261,10 +1253,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@9.35.0", "@eslint/js@^9.35.0": - version "9.35.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.35.0.tgz#ffbc7e13cf1204db18552e9cd9d4a8e17c692d07" - integrity sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw== +"@eslint/js@9.36.0", "@eslint/js@^9.36.0": + version "9.36.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.36.0.tgz#b1a3893dd6ce2defed5fd49de805ba40368e8fef" + integrity sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw== "@eslint/object-schema@^2.1.6": version "2.1.6" @@ -1377,50 +1369,50 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@30.1.2": - version "30.1.2" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-30.1.2.tgz#3d32b966454d57874520b27647129228a654c995" - integrity sha512-BGMAxj8VRmoD0MoA/jo9alMXSRoqW8KPeqOfEo1ncxnRLatTBCpRoOwlwlEMdudp68Q6WSGwYrrLtTGOh8fLzw== +"@jest/console@30.2.0": + version "30.2.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-30.2.0.tgz#c52fcd5b58fdd2e8eb66b2fd8ae56f2f64d05b28" + integrity sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ== dependencies: - "@jest/types" "30.0.5" + "@jest/types" "30.2.0" "@types/node" "*" chalk "^4.1.2" - jest-message-util "30.1.0" - jest-util "30.0.5" + jest-message-util "30.2.0" + jest-util "30.2.0" slash "^3.0.0" -"@jest/core@30.1.3": - version "30.1.3" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-30.1.3.tgz#c097dcead36ac6ccee2825a35078163465f8b79d" - integrity sha512-LIQz7NEDDO1+eyOA2ZmkiAyYvZuo6s1UxD/e2IHldR6D7UYogVq3arTmli07MkENLq6/3JEQjp0mA8rrHHJ8KQ== +"@jest/core@30.2.0": + version "30.2.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-30.2.0.tgz#813d59faa5abd5510964a8b3a7b17cc77b775275" + integrity sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ== dependencies: - "@jest/console" "30.1.2" + "@jest/console" "30.2.0" "@jest/pattern" "30.0.1" - "@jest/reporters" "30.1.3" - "@jest/test-result" "30.1.3" - "@jest/transform" "30.1.2" - "@jest/types" "30.0.5" + "@jest/reporters" "30.2.0" + "@jest/test-result" "30.2.0" + "@jest/transform" "30.2.0" + "@jest/types" "30.2.0" "@types/node" "*" ansi-escapes "^4.3.2" chalk "^4.1.2" ci-info "^4.2.0" exit-x "^0.2.2" graceful-fs "^4.2.11" - jest-changed-files "30.0.5" - jest-config "30.1.3" - jest-haste-map "30.1.0" - jest-message-util "30.1.0" + jest-changed-files "30.2.0" + jest-config "30.2.0" + jest-haste-map "30.2.0" + jest-message-util "30.2.0" jest-regex-util "30.0.1" - jest-resolve "30.1.3" - jest-resolve-dependencies "30.1.3" - jest-runner "30.1.3" - jest-runtime "30.1.3" - jest-snapshot "30.1.2" - jest-util "30.0.5" - jest-validate "30.1.0" - jest-watcher "30.1.3" + jest-resolve "30.2.0" + jest-resolve-dependencies "30.2.0" + jest-runner "30.2.0" + jest-runtime "30.2.0" + jest-snapshot "30.2.0" + jest-util "30.2.0" + jest-validate "30.2.0" + jest-watcher "30.2.0" micromatch "^4.0.8" - pretty-format "30.0.5" + pretty-format "30.2.0" slash "^3.0.0" "@jest/diff-sequences@30.0.1": @@ -1428,70 +1420,70 @@ resolved "https://registry.yarnpkg.com/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz#0ededeae4d071f5c8ffe3678d15f3a1be09156be" integrity sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw== -"@jest/environment-jsdom-abstract@30.1.2": - version "30.1.2" - resolved "https://registry.yarnpkg.com/@jest/environment-jsdom-abstract/-/environment-jsdom-abstract-30.1.2.tgz#4ede626bf27a52c21f11917608f4ab539363b16f" - integrity sha512-u8kTh/ZBl97GOmnGJLYK/1GuwAruMC4hoP6xuk/kwltmVWsA9u/6fH1/CsPVGt2O+Wn2yEjs8n1B1zZJ62Cx0w== +"@jest/environment-jsdom-abstract@30.2.0": + version "30.2.0" + resolved "https://registry.yarnpkg.com/@jest/environment-jsdom-abstract/-/environment-jsdom-abstract-30.2.0.tgz#1313f9b3b509c31298c241203161b36622865181" + integrity sha512-kazxw2L9IPuZpQ0mEt9lu9Z98SqR74xcagANmMBU16X0lS23yPc0+S6hGLUz8kVRlomZEs/5S/Zlpqwf5yu6OQ== dependencies: - "@jest/environment" "30.1.2" - "@jest/fake-timers" "30.1.2" - "@jest/types" "30.0.5" + "@jest/environment" "30.2.0" + "@jest/fake-timers" "30.2.0" + "@jest/types" "30.2.0" "@types/jsdom" "^21.1.7" "@types/node" "*" - jest-mock "30.0.5" - jest-util "30.0.5" + jest-mock "30.2.0" + jest-util "30.2.0" -"@jest/environment@30.1.2": - version "30.1.2" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-30.1.2.tgz#f1bd73a7571f96104a3ff2007747c2ce12b5c038" - integrity sha512-N8t1Ytw4/mr9uN28OnVf0SYE2dGhaIxOVYcwsf9IInBKjvofAjbFRvedvBBlyTYk2knbJTiEjEJ2PyyDIBnd9w== +"@jest/environment@30.2.0": + version "30.2.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-30.2.0.tgz#1e673cdb8b93ded707cf6631b8353011460831fa" + integrity sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g== dependencies: - "@jest/fake-timers" "30.1.2" - "@jest/types" "30.0.5" + "@jest/fake-timers" "30.2.0" + "@jest/types" "30.2.0" "@types/node" "*" - jest-mock "30.0.5" + jest-mock "30.2.0" -"@jest/expect-utils@30.1.2": - version "30.1.2" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-30.1.2.tgz#88ea18040f707c9fadb6fd9e77568cae5266cee8" - integrity sha512-HXy1qT/bfdjCv7iC336ExbqqYtZvljrV8odNdso7dWK9bSeHtLlvwWWC3YSybSPL03Gg5rug6WLCZAZFH72m0A== +"@jest/expect-utils@30.2.0": + version "30.2.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-30.2.0.tgz#4f95413d4748454fdb17404bf1141827d15e6011" + integrity sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA== dependencies: "@jest/get-type" "30.1.0" -"@jest/expect@30.1.2": - version "30.1.2" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-30.1.2.tgz#35283e8bd083aab6cc26d4d30aeeacb5e7190a0f" - integrity sha512-tyaIExOwQRCxPCGNC05lIjWJztDwk2gPDNSDGg1zitXJJ8dC3++G/CRjE5mb2wQsf89+lsgAgqxxNpDLiCViTA== +"@jest/expect@30.2.0": + version "30.2.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-30.2.0.tgz#9a5968499bb8add2bbb09136f69f7df5ddbf3185" + integrity sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA== dependencies: - expect "30.1.2" - jest-snapshot "30.1.2" + expect "30.2.0" + jest-snapshot "30.2.0" -"@jest/fake-timers@30.1.2": - version "30.1.2" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-30.1.2.tgz#cb0df6995034d50c6973ffd3ffdaa1353a816c41" - integrity sha512-Beljfv9AYkr9K+ETX9tvV61rJTY706BhBUtiaepQHeEGfe0DbpvUA5Z3fomwc5Xkhns6NWrcFDZn+72fLieUnA== +"@jest/fake-timers@30.2.0": + version "30.2.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-30.2.0.tgz#0941ddc28a339b9819542495b5408622dc9e94ec" + integrity sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw== dependencies: - "@jest/types" "30.0.5" + "@jest/types" "30.2.0" "@sinonjs/fake-timers" "^13.0.0" "@types/node" "*" - jest-message-util "30.1.0" - jest-mock "30.0.5" - jest-util "30.0.5" + jest-message-util "30.2.0" + jest-mock "30.2.0" + jest-util "30.2.0" "@jest/get-type@30.1.0": version "30.1.0" resolved "https://registry.yarnpkg.com/@jest/get-type/-/get-type-30.1.0.tgz#4fcb4dc2ebcf0811be1c04fd1cb79c2dba431cbc" integrity sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA== -"@jest/globals@30.1.2": - version "30.1.2" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-30.1.2.tgz#821cad7d8ef3dc145979088bb0bfbc1f81a5d8ce" - integrity sha512-teNTPZ8yZe3ahbYnvnVRDeOjr+3pu2uiAtNtrEsiMjVPPj+cXd5E/fr8BL7v/T7F31vYdEHrI5cC/2OoO/vM9A== +"@jest/globals@30.2.0": + version "30.2.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-30.2.0.tgz#2f4b696d5862664b89c4ee2e49ae24d2bb7e0988" + integrity sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw== dependencies: - "@jest/environment" "30.1.2" - "@jest/expect" "30.1.2" - "@jest/types" "30.0.5" - jest-mock "30.0.5" + "@jest/environment" "30.2.0" + "@jest/expect" "30.2.0" + "@jest/types" "30.2.0" + jest-mock "30.2.0" "@jest/pattern@30.0.1": version "30.0.1" @@ -1501,16 +1493,16 @@ "@types/node" "*" jest-regex-util "30.0.1" -"@jest/reporters@30.1.3": - version "30.1.3" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-30.1.3.tgz#015b5838b3edf60f6e995186cd805b7fcbac86b3" - integrity sha512-VWEQmJWfXMOrzdFEOyGjUEOuVXllgZsoPtEHZzfdNz18RmzJ5nlR6kp8hDdY8dDS1yGOXAY7DHT+AOHIPSBV0w== +"@jest/reporters@30.2.0": + version "30.2.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-30.2.0.tgz#a36b28fcbaf0c4595250b108e6f20e363348fd91" + integrity sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "30.1.2" - "@jest/test-result" "30.1.3" - "@jest/transform" "30.1.2" - "@jest/types" "30.0.5" + "@jest/console" "30.2.0" + "@jest/test-result" "30.2.0" + "@jest/transform" "30.2.0" + "@jest/types" "30.2.0" "@jridgewell/trace-mapping" "^0.3.25" "@types/node" "*" chalk "^4.1.2" @@ -1523,9 +1515,9 @@ istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^5.0.0" istanbul-reports "^3.1.3" - jest-message-util "30.1.0" - jest-util "30.0.5" - jest-worker "30.1.0" + jest-message-util "30.2.0" + jest-util "30.2.0" + jest-worker "30.2.0" slash "^3.0.0" string-length "^4.0.2" v8-to-istanbul "^9.0.1" @@ -1544,12 +1536,12 @@ dependencies: "@sinclair/typebox" "^0.27.8" -"@jest/snapshot-utils@30.1.2": - version "30.1.2" - resolved "https://registry.yarnpkg.com/@jest/snapshot-utils/-/snapshot-utils-30.1.2.tgz#320500eba29a25c33e9ec968154e521873624309" - integrity sha512-vHoMTpimcPSR7OxS2S0V1Cpg8eKDRxucHjoWl5u4RQcnxqQrV3avETiFpl8etn4dqxEGarBeHbIBety/f8mLXw== +"@jest/snapshot-utils@30.2.0": + version "30.2.0" + resolved "https://registry.yarnpkg.com/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz#387858eb90c2f98f67bff327435a532ac5309fbe" + integrity sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug== dependencies: - "@jest/types" "30.0.5" + "@jest/types" "30.2.0" chalk "^4.1.2" graceful-fs "^4.2.11" natural-compare "^1.4.0" @@ -1563,51 +1555,51 @@ callsites "^3.1.0" graceful-fs "^4.2.11" -"@jest/test-result@30.1.3": - version "30.1.3" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-30.1.3.tgz#69fe7ff93da8c0c47bae245727e0ce23571d058e" - integrity sha512-P9IV8T24D43cNRANPPokn7tZh0FAFnYS2HIfi5vK18CjRkTDR9Y3e1BoEcAJnl4ghZZF4Ecda4M/k41QkvurEQ== +"@jest/test-result@30.2.0": + version "30.2.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-30.2.0.tgz#9c0124377fb7996cdffb86eda3dbc56eacab363d" + integrity sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg== dependencies: - "@jest/console" "30.1.2" - "@jest/types" "30.0.5" + "@jest/console" "30.2.0" + "@jest/types" "30.2.0" "@types/istanbul-lib-coverage" "^2.0.6" collect-v8-coverage "^1.0.2" -"@jest/test-sequencer@30.1.3": - version "30.1.3" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-30.1.3.tgz#df64038d46150e704ed07c5fee4626609f518089" - integrity sha512-82J+hzC0qeQIiiZDThh+YUadvshdBswi5nuyXlEmXzrhw5ZQSRHeQ5LpVMD/xc8B3wPePvs6VMzHnntxL+4E3w== +"@jest/test-sequencer@30.2.0": + version "30.2.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-30.2.0.tgz#bf0066bc72e176d58f5dfa7f212b6e7eee44f221" + integrity sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q== dependencies: - "@jest/test-result" "30.1.3" + "@jest/test-result" "30.2.0" graceful-fs "^4.2.11" - jest-haste-map "30.1.0" + jest-haste-map "30.2.0" slash "^3.0.0" -"@jest/transform@30.1.2": - version "30.1.2" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-30.1.2.tgz#42624a9c89f2427cd413b989aaf9f6aeb58cae56" - integrity sha512-UYYFGifSgfjujf1Cbd3iU/IQoSd6uwsj8XHj5DSDf5ERDcWMdJOPTkHWXj4U+Z/uMagyOQZ6Vne8C4nRIrCxqA== +"@jest/transform@30.2.0": + version "30.2.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-30.2.0.tgz#54bef1a4510dcbd58d5d4de4fe2980a63077ef2a" + integrity sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA== dependencies: "@babel/core" "^7.27.4" - "@jest/types" "30.0.5" + "@jest/types" "30.2.0" "@jridgewell/trace-mapping" "^0.3.25" - babel-plugin-istanbul "^7.0.0" + babel-plugin-istanbul "^7.0.1" chalk "^4.1.2" convert-source-map "^2.0.0" fast-json-stable-stringify "^2.1.0" graceful-fs "^4.2.11" - jest-haste-map "30.1.0" + jest-haste-map "30.2.0" jest-regex-util "30.0.1" - jest-util "30.0.5" + jest-util "30.2.0" micromatch "^4.0.8" pirates "^4.0.7" slash "^3.0.0" write-file-atomic "^5.0.1" -"@jest/types@30.0.5": - version "30.0.5" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-30.0.5.tgz#29a33a4c036e3904f1cfd94f6fe77f89d2e1cc05" - integrity sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ== +"@jest/types@30.2.0": + version "30.2.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-30.2.0.tgz#1c678a7924b8f59eafd4c77d56b6d0ba976d62b8" + integrity sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg== dependencies: "@jest/pattern" "30.0.1" "@jest/schemas" "30.0.5" @@ -1617,20 +1609,20 @@ "@types/yargs" "^17.0.33" chalk "^4.1.2" -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.13" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" + integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/sourcemap-codec" "^1.5.0" + "@jridgewell/trace-mapping" "^0.3.24" -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.12": - version "0.3.12" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz#2234ce26c62889f03db3d7fea43c1932ab3e927b" - integrity sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg== +"@jridgewell/remapping@^2.3.5": + version "2.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1" + integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" + "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" "@jridgewell/resolve-uri@^3.1.0": @@ -1638,11 +1630,6 @@ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== -"@jridgewell/set-array@^1.0.0": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - "@jridgewell/source-map@^0.3.3": version "0.3.5" resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" @@ -1651,7 +1638,7 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": +"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": version "1.5.4" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz#7358043433b2e5da569aa02cbc4c121da3af27d7" integrity sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw== @@ -1998,10 +1985,10 @@ picocolors "1.1.1" pretty-format "^27.0.2" -"@testing-library/jest-dom@^6.8.0": - version "6.8.0" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.8.0.tgz#697db9424f0d21d8216f1958fa0b1b69b5f43923" - integrity sha512-WgXcWzVM6idy5JaftTVC8Vs83NKRmGJz4Hqs4oyOuO2J4r/y79vvKZsb+CaGyCSEbUPI6OsewfPd0G1A0/TUZQ== +"@testing-library/jest-dom@^6.9.1": + version "6.9.1" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz#7613a04e146dd2976d24ddf019730d57a89d56c2" + integrity sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA== dependencies: "@adobe/css-tools" "^4.4.0" aria-query "^5.0.0" @@ -2017,10 +2004,10 @@ dependencies: "@babel/runtime" "^7.12.5" -"@tgwf/co2@^0.16.8": - version "0.16.8" - resolved "https://registry.yarnpkg.com/@tgwf/co2/-/co2-0.16.8.tgz#dc49b9aec23438c918cb664b6367486be4af5fd3" - integrity sha512-o0NPZVaB65Y9Unqi6i+RmwtPrkAf11MhagpCc/b99PPBGNChu7jlgAhlo/B1ZiklPvAL+d0Z719GJYssSWeGBQ== +"@tgwf/co2@^0.16.9": + version "0.16.9" + resolved "https://registry.yarnpkg.com/@tgwf/co2/-/co2-0.16.9.tgz#629dfcc7bc3b5980047793932d9254b9b9578371" + integrity sha512-+nuT7HS5r22lbW4MdgSPHhirYBjHR6Q8sz5kX6dKdK+yIkRukLAGaH6L/toZwVEOuEeeIRfWYJuaJIoxEGDMXg== "@tootallnate/once@1": version "1.1.2" @@ -2329,10 +2316,10 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@>=13.7.0", "@types/node@^22.18.1": - version "22.18.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.18.1.tgz#cc85ee6999b2a2928739281d2f56ff410a140c52" - integrity sha512-rzSDyhn4cYznVG+PCzGe1lwuMYJrcBS1fc3JqSa2PvtABwWo+dZ1ij5OVok3tqfpEBCBoaR4d7upFJk73HRJDw== +"@types/node@*", "@types/node@>=13.7.0", "@types/node@^22.18.10": + version "22.18.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.18.10.tgz#37f0ac8d2ec41af7bba06f162c85ff409e4e3420" + integrity sha512-anNG/V/Efn/YZY4pRzbACnKxNKoBng2VTFydVu8RRs5hQjikP8CQfaeAV59VFSCzKNp90mXiVXW2QzV56rwMrg== dependencies: undici-types "~6.21.0" @@ -2395,10 +2382,10 @@ resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.12.tgz#b5d76568485b02a307238270bfe96cb51ee2a044" integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w== -"@types/react@*", "@types/react@^18.3.24": - version "18.3.24" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.24.tgz#f6a5a4c613242dfe3af0dcee2b4ec47b92d9b6bd" - integrity sha512-0dLEBsA1kI3OezMBF8nSsb7Nk19ZnsyE1LLhB8r27KbgU5H4pvuqZLdtE+aUkJVoXgTVuA+iLIwmZ0TuK4tx6A== +"@types/react@*", "@types/react@^18.3.26": + version "18.3.26" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.26.tgz#4c5970878d30db3d2a0bca1e4eb5f258e391bbeb" + integrity sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA== dependencies: "@types/prop-types" "*" csstype "^3.0.2" @@ -2505,79 +2492,79 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^8.41.0": - version "8.41.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.41.0.tgz#42209e2ce3e2274de0f5f9b75c777deedacaa558" - integrity sha512-8fz6oa6wEKZrhXWro/S3n2eRJqlRcIa6SlDh59FXJ5Wp5XRZ8B9ixpJDcjadHq47hMx0u+HW6SNa6LjJQ6NLtw== +"@typescript-eslint/eslint-plugin@^8.45.0": + version "8.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.45.0.tgz#9f251d4e85ec5089e7cccb09257ce93dbf0d7744" + integrity sha512-HC3y9CVuevvWCl/oyZuI47dOeDF9ztdMEfMH8/DW/Mhwa9cCLnK1oD7JoTVGW/u7kFzNZUKUoyJEqkaJh5y3Wg== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.41.0" - "@typescript-eslint/type-utils" "8.41.0" - "@typescript-eslint/utils" "8.41.0" - "@typescript-eslint/visitor-keys" "8.41.0" + "@typescript-eslint/scope-manager" "8.45.0" + "@typescript-eslint/type-utils" "8.45.0" + "@typescript-eslint/utils" "8.45.0" + "@typescript-eslint/visitor-keys" "8.45.0" graphemer "^1.4.0" ignore "^7.0.0" natural-compare "^1.4.0" ts-api-utils "^2.1.0" -"@typescript-eslint/parser@^8.41.0": - version "8.41.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.41.0.tgz#677f5b2b3fa947ee1eac4129220c051b1990d898" - integrity sha512-gTtSdWX9xiMPA/7MV9STjJOOYtWwIJIYxkQxnSV1U3xcE+mnJSH3f6zI0RYP+ew66WSlZ5ed+h0VCxsvdC1jJg== +"@typescript-eslint/parser@^8.45.0": + version "8.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.45.0.tgz#571660c98824aefb4a6ec3b3766655d1348520a4" + integrity sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ== dependencies: - "@typescript-eslint/scope-manager" "8.41.0" - "@typescript-eslint/types" "8.41.0" - "@typescript-eslint/typescript-estree" "8.41.0" - "@typescript-eslint/visitor-keys" "8.41.0" + "@typescript-eslint/scope-manager" "8.45.0" + "@typescript-eslint/types" "8.45.0" + "@typescript-eslint/typescript-estree" "8.45.0" + "@typescript-eslint/visitor-keys" "8.45.0" debug "^4.3.4" -"@typescript-eslint/project-service@8.41.0": - version "8.41.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.41.0.tgz#08ebf882d413a038926e73fda36e00c3dba84882" - integrity sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ== +"@typescript-eslint/project-service@8.45.0": + version "8.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.45.0.tgz#f83dda1bca31dae2fd6821f9131daf1edebfd46c" + integrity sha512-3pcVHwMG/iA8afdGLMuTibGR7pDsn9RjDev6CCB+naRsSYs2pns5QbinF4Xqw6YC/Sj3lMrm/Im0eMfaa61WUg== dependencies: - "@typescript-eslint/tsconfig-utils" "^8.41.0" - "@typescript-eslint/types" "^8.41.0" + "@typescript-eslint/tsconfig-utils" "^8.45.0" + "@typescript-eslint/types" "^8.45.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@8.41.0", "@typescript-eslint/scope-manager@^8.15.0": - version "8.41.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.41.0.tgz#c8aba12129cb9cead1f1727f58e6a0fcebeecdb5" - integrity sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ== +"@typescript-eslint/scope-manager@8.45.0", "@typescript-eslint/scope-manager@^8.15.0": + version "8.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.45.0.tgz#59615ba506a9e3479d1efb0d09d6ab52f2a19142" + integrity sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA== dependencies: - "@typescript-eslint/types" "8.41.0" - "@typescript-eslint/visitor-keys" "8.41.0" + "@typescript-eslint/types" "8.45.0" + "@typescript-eslint/visitor-keys" "8.45.0" -"@typescript-eslint/tsconfig-utils@8.41.0", "@typescript-eslint/tsconfig-utils@^8.41.0": - version "8.41.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.41.0.tgz#134dee36eb16cdd78095a20bca0516d10b5dda75" - integrity sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw== +"@typescript-eslint/tsconfig-utils@8.45.0", "@typescript-eslint/tsconfig-utils@^8.45.0": + version "8.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.45.0.tgz#63d38282790a2566c571bad423e7c1cad1f3d64c" + integrity sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w== -"@typescript-eslint/type-utils@8.41.0": - version "8.41.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.41.0.tgz#68d401e38fccf239925447e97bdbd048a9891ae5" - integrity sha512-63qt1h91vg3KsjVVonFJWjgSK7pZHSQFKH6uwqxAH9bBrsyRhO6ONoKyXxyVBzG1lJnFAJcKAcxLS54N1ee1OQ== +"@typescript-eslint/type-utils@8.45.0": + version "8.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.45.0.tgz#04004bdf2598844faa29fb936fb6b0ee10d6d3f3" + integrity sha512-bpjepLlHceKgyMEPglAeULX1vixJDgaKocp0RVJ5u4wLJIMNuKtUXIczpJCPcn2waII0yuvks/5m5/h3ZQKs0A== dependencies: - "@typescript-eslint/types" "8.41.0" - "@typescript-eslint/typescript-estree" "8.41.0" - "@typescript-eslint/utils" "8.41.0" + "@typescript-eslint/types" "8.45.0" + "@typescript-eslint/typescript-estree" "8.45.0" + "@typescript-eslint/utils" "8.45.0" debug "^4.3.4" ts-api-utils "^2.1.0" -"@typescript-eslint/types@8.41.0", "@typescript-eslint/types@^8.41.0": - version "8.41.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.41.0.tgz#9935afeaae65e535abcbcee95383fa649c64d16d" - integrity sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag== +"@typescript-eslint/types@8.45.0", "@typescript-eslint/types@^8.45.0": + version "8.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.45.0.tgz#fc01cd2a4690b9713b02f895e82fb43f7d960684" + integrity sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA== -"@typescript-eslint/typescript-estree@8.41.0": - version "8.41.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.41.0.tgz#7c9cff8b4334ce96f14e9689692e8cf426ce4d59" - integrity sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ== +"@typescript-eslint/typescript-estree@8.45.0": + version "8.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.45.0.tgz#3498500f109a89b104d2770497c707e56dfe062d" + integrity sha512-GfE1NfVbLam6XQ0LcERKwdTTPlLvHvXXhOeUGC1OXi4eQBoyy1iVsW+uzJ/J9jtCz6/7GCQ9MtrQ0fml/jWCnA== dependencies: - "@typescript-eslint/project-service" "8.41.0" - "@typescript-eslint/tsconfig-utils" "8.41.0" - "@typescript-eslint/types" "8.41.0" - "@typescript-eslint/visitor-keys" "8.41.0" + "@typescript-eslint/project-service" "8.45.0" + "@typescript-eslint/tsconfig-utils" "8.45.0" + "@typescript-eslint/types" "8.45.0" + "@typescript-eslint/visitor-keys" "8.45.0" debug "^4.3.4" fast-glob "^3.3.2" is-glob "^4.0.3" @@ -2585,22 +2572,22 @@ semver "^7.6.0" ts-api-utils "^2.1.0" -"@typescript-eslint/utils@8.41.0", "@typescript-eslint/utils@^8.0.0", "@typescript-eslint/utils@^8.15.0": - version "8.41.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.41.0.tgz#17cb3b766c1626311004ea41ffd8c27eb226b953" - integrity sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A== +"@typescript-eslint/utils@8.45.0", "@typescript-eslint/utils@^8.0.0", "@typescript-eslint/utils@^8.15.0": + version "8.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.45.0.tgz#6e68e92d99019fdf56018d0e6664c76a70470c95" + integrity sha512-bxi1ht+tLYg4+XV2knz/F7RVhU0k6VrSMc9sb8DQ6fyCTrGQLHfo7lDtN0QJjZjKkLA2ThrKuCdHEvLReqtIGg== dependencies: "@eslint-community/eslint-utils" "^4.7.0" - "@typescript-eslint/scope-manager" "8.41.0" - "@typescript-eslint/types" "8.41.0" - "@typescript-eslint/typescript-estree" "8.41.0" + "@typescript-eslint/scope-manager" "8.45.0" + "@typescript-eslint/types" "8.45.0" + "@typescript-eslint/typescript-estree" "8.45.0" -"@typescript-eslint/visitor-keys@8.41.0": - version "8.41.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.41.0.tgz#16eb99b55d207f6688002a2cf425e039579aa9a9" - integrity sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg== +"@typescript-eslint/visitor-keys@8.45.0": + version "8.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.45.0.tgz#4e3bcc55da64ac61069ebfe62ca240567ac7d784" + integrity sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag== dependencies: - "@typescript-eslint/types" "8.41.0" + "@typescript-eslint/types" "8.45.0" eslint-visitor-keys "^4.2.1" "@ungap/structured-clone@^1.3.0": @@ -3250,15 +3237,15 @@ available-typed-arrays@^1.0.7: dependencies: possible-typed-array-names "^1.0.0" -babel-jest@30.1.2, babel-jest@^30.1.2: - version "30.1.2" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-30.1.2.tgz#decd53b3a0cafca49443f93fb7a2c0fba55510da" - integrity sha512-IQCus1rt9kaSh7PQxLYRY5NmkNrNlU2TpabzwV7T2jljnpdHOcmnYYv8QmE04Li4S3a2Lj8/yXyET5pBarPr6g== +babel-jest@30.2.0, babel-jest@^30.2.0: + version "30.2.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-30.2.0.tgz#fd44a1ec9552be35ead881f7381faa7d8f3b95ac" + integrity sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw== dependencies: - "@jest/transform" "30.1.2" + "@jest/transform" "30.2.0" "@types/babel__core" "^7.20.5" - babel-plugin-istanbul "^7.0.0" - babel-preset-jest "30.0.1" + babel-plugin-istanbul "^7.0.1" + babel-preset-jest "30.2.0" chalk "^4.1.2" graceful-fs "^4.2.11" slash "^3.0.0" @@ -3270,10 +3257,10 @@ babel-loader@^10.0.0: dependencies: find-up "^5.0.0" -babel-plugin-istanbul@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.0.tgz#629a178f63b83dc9ecee46fd20266283b1f11280" - integrity sha512-C5OzENSx/A+gt7t4VH1I2XsflxyPUmXRFPKBxt33xncdOmq7oROVM3bZv9Ysjjkv8OJYDMa+tKuKMvqU/H3xdw== +babel-plugin-istanbul@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz#d8b518c8ea199364cf84ccc82de89740236daf92" + integrity sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@istanbuljs/load-nyc-config" "^1.0.0" @@ -3281,13 +3268,11 @@ babel-plugin-istanbul@^7.0.0: istanbul-lib-instrument "^6.0.2" test-exclude "^6.0.0" -babel-plugin-jest-hoist@30.0.1: - version "30.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.0.1.tgz#f271b2066d2c1fb26a863adb8e13f85b06247125" - integrity sha512-zTPME3pI50NsFW8ZBaVIOeAxzEY7XHlmWeXXu9srI+9kNfzCUTy8MFan46xOGZY8NZThMqq+e3qZUKsvXbasnQ== +babel-plugin-jest-hoist@30.2.0: + version "30.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.2.0.tgz#94c250d36b43f95900f3a219241e0f4648191ce2" + integrity sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA== dependencies: - "@babel/template" "^7.27.2" - "@babel/types" "^7.27.3" "@types/babel__core" "^7.20.5" babel-plugin-module-resolver@^5.0.2: @@ -3325,10 +3310,10 @@ babel-plugin-polyfill-regenerator@^0.6.5: dependencies: "@babel/helper-define-polyfill-provider" "^0.6.5" -babel-preset-current-node-syntax@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30" - integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== +babel-preset-current-node-syntax@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz#20730d6cdc7dda5d89401cab10ac6a32067acde6" + integrity sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-bigint" "^7.8.3" @@ -3346,13 +3331,13 @@ babel-preset-current-node-syntax@^1.1.0: "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" -babel-preset-jest@30.0.1: - version "30.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-30.0.1.tgz#7d28db9531bce264e846c8483d54236244b8ae88" - integrity sha512-+YHejD5iTWI46cZmcc/YtX4gaKBtdqCHCVfuVinizVpbmyjO3zYmeuyFdfA8duRqQZfgCAMlsfmkVbJ+e2MAJw== +babel-preset-jest@30.2.0: + version "30.2.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-30.2.0.tgz#04717843e561347781d6d7f69c81e6bcc3ed11ce" + integrity sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ== dependencies: - babel-plugin-jest-hoist "30.0.1" - babel-preset-current-node-syntax "^1.1.0" + babel-plugin-jest-hoist "30.2.0" + babel-preset-current-node-syntax "^1.2.0" bail@^2.0.0: version "2.0.1" @@ -3369,6 +3354,11 @@ balanced-match@^2.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9" integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA== +baseline-browser-mapping@^2.8.9: + version "2.8.16" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.8.16.tgz#e17789673e7f4b7654f81ab2ef25e96ab6a895f9" + integrity sha512-OMu3BGQ4E7P1ErFsIPpbJh0qvDudM/UuJeHgkAvfWe+0HFJCXh+t/l8L6fVLR55RI/UbKrVLnAXZSVwd9ysWYw== + basic-auth@^2.0.1, basic-auth@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" @@ -3458,14 +3448,15 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" -browserslist@^4.0.0, browserslist@^4.24.0, browserslist@^4.24.4, browserslist@^4.24.5, browserslist@^4.25.1, browserslist@^4.25.4: - version "4.25.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.25.4.tgz#ebdd0e1d1cf3911834bab3a6cd7b917d9babf5af" - integrity sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg== +browserslist@^4.0.0, browserslist@^4.24.0, browserslist@^4.24.4, browserslist@^4.24.5, browserslist@^4.25.1, browserslist@^4.26.3: + version "4.26.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.26.3.tgz#40fbfe2d1cd420281ce5b1caa8840049c79afb56" + integrity sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w== dependencies: - caniuse-lite "^1.0.30001737" - electron-to-chromium "^1.5.211" - node-releases "^2.0.19" + baseline-browser-mapping "^2.8.9" + caniuse-lite "^1.0.30001746" + electron-to-chromium "^1.5.227" + node-releases "^2.0.21" update-browserslist-db "^1.1.3" bser@2.1.1: @@ -3638,10 +3629,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001731, caniuse-lite@^1.0.30001737: - version "1.0.30001741" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001741.tgz#67fb92953edc536442f3c9da74320774aa523143" - integrity sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001743, caniuse-lite@^1.0.30001746: + version "1.0.30001750" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001750.tgz#c229f82930033abd1502c6f73035356cf528bfbc" + integrity sha512-cuom0g5sdX6rw00qOoLNSFCJ9/mYIsuSOA+yzpDw8eopiFqcVwQvZHqov0vmEighRxX++cfC0Vg1G+1Iy/mSpQ== ccount@^2.0.0: version "2.0.1" @@ -4093,10 +4084,10 @@ crelt@^1.0.5, crelt@^1.0.6: resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.6.tgz#7cc898ea74e190fb6ef9dae57f8f81cf7302df72" integrity sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g== -cross-env@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-10.0.0.tgz#ba25823cfa1ed6af293dcded8796fa16cd162456" - integrity sha512-aU8qlEK/nHYtVuN4p7UQgAwVljzMg8hB4YK5ThRqD2l/ziSnryncPNn7bMLt5cFYsKVKBh8HqLqyCoTupEUu7Q== +cross-env@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-10.1.0.tgz#cfd2a6200df9ed75bfb9cb3d7ce609c13ea21783" + integrity sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw== dependencies: "@epic-web/invariant" "^1.0.0" cross-spawn "^7.0.6" @@ -4313,10 +4304,10 @@ data-view-byte-offset@^1.0.1: es-errors "^1.3.0" is-data-view "^1.0.1" -debug@*, debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" - integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== +debug@*, debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.1, debug@^4.4.3: + version "4.4.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== dependencies: ms "^2.1.3" @@ -4664,10 +4655,10 @@ ejs@^3.1.6: dependencies: jake "^10.8.5" -electron-to-chromium@^1.5.211: - version "1.5.217" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.217.tgz#71285850356ef48bc08275b26f0f355721e0f17d" - integrity sha512-Pludfu5iBxp9XzNl0qq2G87hdD17ZV7h5T4n6rQXDi3nCyloBV3jreE9+8GC6g4X/5yxqVgXEURpcLtM0WS4jA== +electron-to-chromium@^1.5.227: + version "1.5.237" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.237.tgz#eacf61cef3f6345d0069ab427585c5a04d7084f0" + integrity sha512-icUt1NvfhGLar5lSWH3tHNzablaA5js3HVHacQimfP8ViEBOQv+L7DKEuHdbTZ0SKCO1ogTJTIL1Gwk9S6Qvcg== emittery@^0.13.1: version "0.13.1" @@ -5055,10 +5046,10 @@ eslint-visitor-keys@^4.2.1: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== -eslint@^9.35.0: - version "9.35.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.35.0.tgz#7a89054b7b9ee1dfd1b62035d8ce75547773f47e" - integrity sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg== +eslint@^9.36.0: + version "9.36.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.36.0.tgz#9cc5cbbfb9c01070425d9bfed81b4e79a1c09088" + integrity sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ== dependencies: "@eslint-community/eslint-utils" "^4.8.0" "@eslint-community/regexpp" "^4.12.1" @@ -5066,7 +5057,7 @@ eslint@^9.35.0: "@eslint/config-helpers" "^0.3.1" "@eslint/core" "^0.15.2" "@eslint/eslintrc" "^3.3.1" - "@eslint/js" "9.35.0" + "@eslint/js" "9.36.0" "@eslint/plugin-kit" "^0.3.5" "@humanfs/node" "^0.16.6" "@humanwhocodes/module-importer" "^1.0.1" @@ -5210,17 +5201,17 @@ exit-x@^0.2.2: resolved "https://registry.yarnpkg.com/exit-x/-/exit-x-0.2.2.tgz#1f9052de3b8d99a696b10dad5bced9bdd5c3aa64" integrity sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ== -expect@30.1.2, expect@^30.0.0: - version "30.1.2" - resolved "https://registry.yarnpkg.com/expect/-/expect-30.1.2.tgz#094909c2443f76b9e208fafac4a315aaaf924580" - integrity sha512-xvHszRavo28ejws8FpemjhwswGj4w/BetHIL8cU49u4sGyXDw2+p3YbeDbj6xzlxi6kWTjIRSTJ+9sNXPnF0Zg== +expect@30.2.0, expect@^30.0.0: + version "30.2.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-30.2.0.tgz#d4013bed267013c14bc1199cec8aa57cee9b5869" + integrity sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw== dependencies: - "@jest/expect-utils" "30.1.2" + "@jest/expect-utils" "30.2.0" "@jest/get-type" "30.1.0" - jest-matcher-utils "30.1.2" - jest-message-util "30.1.0" - jest-mock "30.0.5" - jest-util "30.0.5" + jest-matcher-utils "30.2.0" + jest-message-util "30.2.0" + jest-mock "30.2.0" + jest-util "30.2.0" express@^4.21.2: version "4.21.2" @@ -5355,7 +5346,7 @@ fetch-mock@^12.5.4: glob-to-regexp "^0.4.1" regexparam "^3.0.0" -file-entry-cache@^10.1.3: +file-entry-cache@^10.1.4: version "10.1.4" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-10.1.4.tgz#1e81441517dc33ba5fe14421d96dc5fe7e37e820" integrity sha512-5XRUFc0WTtUbjfGzEwXc42tiGxQHBmtbUG1h9L2apu4SulCGN3Hqm//9D6FAolf8MYNL7f/YlJl9vy08pj5JuA== @@ -5546,7 +5537,16 @@ from@~0: resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" integrity sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4= -fs-extra@^9.0.0, fs-extra@^9.0.1: +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^9.0.1: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -5717,7 +5717,7 @@ glob@^11.0.3: package-json-from-dist "^1.0.0" path-scurry "^2.0.0" -glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: +glob@^7.1.1, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -5778,10 +5778,10 @@ globals@^14.0.0: resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== -globals@^16.3.0: - version "16.3.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-16.3.0.tgz#66118e765ddaf9e2d880f7e17658543f93f1f667" - integrity sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ== +globals@^16.4.0: + version "16.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-16.4.0.tgz#574bc7e72993d40cf27cf6c241f324ee77808e51" + integrity sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw== globalthis@^1.0.4: version "1.0.4" @@ -6421,10 +6421,10 @@ interpret@^3.1.1: resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== -iongraph-web@0.1.15: - version "0.1.15" - resolved "https://registry.yarnpkg.com/iongraph-web/-/iongraph-web-0.1.15.tgz#8d39240cbfaf476ff7e0f3f14b0301eff33477d7" - integrity sha512-9QRt32bVk9Uskwb0NYgrrGBo3p7gI2pIuwMgq/ifR3jzyfgKQeICZfngW6GM2Wvivxdxb0y8MxIzJ4Kh3cWZuQ== +iongraph-web@0.1.16: + version "0.1.16" + resolved "https://registry.yarnpkg.com/iongraph-web/-/iongraph-web-0.1.16.tgz#c6bc3b4497212c2dcca5d487250498179159efba" + integrity sha512-nGKsH4igN2ixiHaxpYuz62SVorRWMi/4aYc1at7uQJxgfqyEWyvBpOI2vo8oHmeEfS+0u3J4OEy5dfknqmWkWg== ipaddr.js@1.9.1: version "1.9.1" @@ -6911,96 +6911,96 @@ jake@^10.8.5: filelist "^1.0.1" minimatch "^3.0.4" -jest-changed-files@30.0.5: - version "30.0.5" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-30.0.5.tgz#ec448f83bd9caa894dd7da8707f207c356a19924" - integrity sha512-bGl2Ntdx0eAwXuGpdLdVYVr5YQHnSZlQ0y9HVDu565lCUAe9sj6JOtBbMmBBikGIegne9piDDIOeiLVoqTkz4A== +jest-changed-files@30.2.0: + version "30.2.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-30.2.0.tgz#602266e478ed554e1e1469944faa7efd37cee61c" + integrity sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ== dependencies: execa "^5.1.1" - jest-util "30.0.5" + jest-util "30.2.0" p-limit "^3.1.0" -jest-circus@30.1.3: - version "30.1.3" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-30.1.3.tgz#7ee0089f22b2b3e72ab04aee8e037c364a6d73d1" - integrity sha512-Yf3dnhRON2GJT4RYzM89t/EXIWNxKTpWTL9BfF3+geFetWP4XSvJjiU1vrWplOiUkmq8cHLiwuhz+XuUp9DscA== +jest-circus@30.2.0: + version "30.2.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-30.2.0.tgz#98b8198b958748a2f322354311023d1d02e7603f" + integrity sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg== dependencies: - "@jest/environment" "30.1.2" - "@jest/expect" "30.1.2" - "@jest/test-result" "30.1.3" - "@jest/types" "30.0.5" + "@jest/environment" "30.2.0" + "@jest/expect" "30.2.0" + "@jest/test-result" "30.2.0" + "@jest/types" "30.2.0" "@types/node" "*" chalk "^4.1.2" co "^4.6.0" dedent "^1.6.0" is-generator-fn "^2.1.0" - jest-each "30.1.0" - jest-matcher-utils "30.1.2" - jest-message-util "30.1.0" - jest-runtime "30.1.3" - jest-snapshot "30.1.2" - jest-util "30.0.5" + jest-each "30.2.0" + jest-matcher-utils "30.2.0" + jest-message-util "30.2.0" + jest-runtime "30.2.0" + jest-snapshot "30.2.0" + jest-util "30.2.0" p-limit "^3.1.0" - pretty-format "30.0.5" + pretty-format "30.2.0" pure-rand "^7.0.0" slash "^3.0.0" stack-utils "^2.0.6" -jest-cli@30.1.3: - version "30.1.3" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-30.1.3.tgz#3fb8dea88886379eb95a08f954bfc2ed17a9be4f" - integrity sha512-G8E2Ol3OKch1DEeIBl41NP7OiC6LBhfg25Btv+idcusmoUSpqUkbrneMqbW9lVpI/rCKb/uETidb7DNteheuAQ== +jest-cli@30.2.0: + version "30.2.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-30.2.0.tgz#1780f8e9d66bf84a10b369aea60aeda7697dcc67" + integrity sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA== dependencies: - "@jest/core" "30.1.3" - "@jest/test-result" "30.1.3" - "@jest/types" "30.0.5" + "@jest/core" "30.2.0" + "@jest/test-result" "30.2.0" + "@jest/types" "30.2.0" chalk "^4.1.2" exit-x "^0.2.2" import-local "^3.2.0" - jest-config "30.1.3" - jest-util "30.0.5" - jest-validate "30.1.0" + jest-config "30.2.0" + jest-util "30.2.0" + jest-validate "30.2.0" yargs "^17.7.2" -jest-config@30.1.3: - version "30.1.3" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-30.1.3.tgz#10bcf4cd979119bfac6a130fb79d837057ce33d4" - integrity sha512-M/f7gqdQEPgZNA181Myz+GXCe8jXcJsGjCMXUzRj22FIXsZOyHNte84e0exntOvdPaeh9tA0w+B8qlP2fAezfw== +jest-config@30.2.0: + version "30.2.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-30.2.0.tgz#29df8c50e2ad801cc59c406b50176c18c362a90b" + integrity sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA== dependencies: "@babel/core" "^7.27.4" "@jest/get-type" "30.1.0" "@jest/pattern" "30.0.1" - "@jest/test-sequencer" "30.1.3" - "@jest/types" "30.0.5" - babel-jest "30.1.2" + "@jest/test-sequencer" "30.2.0" + "@jest/types" "30.2.0" + babel-jest "30.2.0" chalk "^4.1.2" ci-info "^4.2.0" deepmerge "^4.3.1" glob "^10.3.10" graceful-fs "^4.2.11" - jest-circus "30.1.3" - jest-docblock "30.0.1" - jest-environment-node "30.1.2" + jest-circus "30.2.0" + jest-docblock "30.2.0" + jest-environment-node "30.2.0" jest-regex-util "30.0.1" - jest-resolve "30.1.3" - jest-runner "30.1.3" - jest-util "30.0.5" - jest-validate "30.1.0" + jest-resolve "30.2.0" + jest-runner "30.2.0" + jest-util "30.2.0" + jest-validate "30.2.0" micromatch "^4.0.8" parse-json "^5.2.0" - pretty-format "30.0.5" + pretty-format "30.2.0" slash "^3.0.0" strip-json-comments "^3.1.1" -jest-diff@30.1.2: - version "30.1.2" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-30.1.2.tgz#8ff4217e5b63fef49a5b37462999d8f5299a4eb4" - integrity sha512-4+prq+9J61mOVXCa4Qp8ZjavdxzrWQXrI80GNxP8f4tkI2syPuPrJgdRPZRrfUTRvIoUwcmNLbqEJy9W800+NQ== +jest-diff@30.2.0: + version "30.2.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-30.2.0.tgz#e3ec3a6ea5c5747f605c9e874f83d756cba36825" + integrity sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A== dependencies: "@jest/diff-sequences" "30.0.1" "@jest/get-type" "30.1.0" chalk "^4.1.2" - pretty-format "30.0.5" + pretty-format "30.2.0" jest-diff@^29.0.0: version "29.7.0" @@ -7012,47 +7012,47 @@ jest-diff@^29.0.0: jest-get-type "^29.6.3" pretty-format "^29.7.0" -jest-docblock@30.0.1: - version "30.0.1" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-30.0.1.tgz#545ff59f2fa88996bd470dba7d3798a8421180b1" - integrity sha512-/vF78qn3DYphAaIc3jy4gA7XSAz167n9Bm/wn/1XhTLW7tTBIzXtCJpb/vcmc73NIIeeohCbdL94JasyXUZsGA== +jest-docblock@30.2.0: + version "30.2.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-30.2.0.tgz#42cd98d69f887e531c7352309542b1ce4ee10256" + integrity sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA== dependencies: detect-newline "^3.1.0" -jest-each@30.1.0: - version "30.1.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-30.1.0.tgz#228756d5ea9e4dcb462fc2e90a44ec27dd482d23" - integrity sha512-A+9FKzxPluqogNahpCv04UJvcZ9B3HamqpDNWNKDjtxVRYB8xbZLFuCr8JAJFpNp83CA0anGQFlpQna9Me+/tQ== +jest-each@30.2.0: + version "30.2.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-30.2.0.tgz#39e623ae71641c2ac3ee69b3ba3d258fce8e768d" + integrity sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ== dependencies: "@jest/get-type" "30.1.0" - "@jest/types" "30.0.5" + "@jest/types" "30.2.0" chalk "^4.1.2" - jest-util "30.0.5" - pretty-format "30.0.5" + jest-util "30.2.0" + pretty-format "30.2.0" -jest-environment-jsdom@^30.1.2: - version "30.1.2" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-30.1.2.tgz#30756e73b9b7c10ebbe9c066f30dd1af670eb9c1" - integrity sha512-LXsfAh5+mDTuXDONGl1ZLYxtJEaS06GOoxJb2arcJTjIfh1adYg8zLD8f6P0df8VmjvCaMrLmc1PgHUI/YUTbg== +jest-environment-jsdom@^30.2.0: + version "30.2.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-30.2.0.tgz#e95e0921ed22be974f1d8a324766d12b1844cb2c" + integrity sha512-zbBTiqr2Vl78pKp/laGBREYzbZx9ZtqPjOK4++lL4BNDhxRnahg51HtoDrk9/VjIy9IthNEWdKVd7H5bqBhiWQ== dependencies: - "@jest/environment" "30.1.2" - "@jest/environment-jsdom-abstract" "30.1.2" + "@jest/environment" "30.2.0" + "@jest/environment-jsdom-abstract" "30.2.0" "@types/jsdom" "^21.1.7" "@types/node" "*" jsdom "^26.1.0" -jest-environment-node@30.1.2: - version "30.1.2" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-30.1.2.tgz#ae2f20442f8abc3c6b20120dc789fa38faff568f" - integrity sha512-w8qBiXtqGWJ9xpJIA98M0EIoq079GOQRQUyse5qg1plShUCQ0Ek1VTTcczqKrn3f24TFAgFtT+4q3aOXvjbsuA== +jest-environment-node@30.2.0: + version "30.2.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-30.2.0.tgz#3def7980ebd2fd86e74efd4d2e681f55ab38da0f" + integrity sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA== dependencies: - "@jest/environment" "30.1.2" - "@jest/fake-timers" "30.1.2" - "@jest/types" "30.0.5" + "@jest/environment" "30.2.0" + "@jest/fake-timers" "30.2.0" + "@jest/types" "30.2.0" "@types/node" "*" - jest-mock "30.0.5" - jest-util "30.0.5" - jest-validate "30.1.0" + jest-mock "30.2.0" + jest-util "30.2.0" + jest-validate "30.2.0" jest-extended@^6.0.0: version "6.0.0" @@ -7066,65 +7066,65 @@ jest-get-type@^29.6.3: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== -jest-haste-map@30.1.0: - version "30.1.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-30.1.0.tgz#e54d84e07fac15ea3a98903b735048e36d7d2ed3" - integrity sha512-JLeM84kNjpRkggcGpQLsV7B8W4LNUWz7oDNVnY1Vjj22b5/fAb3kk3htiD+4Na8bmJmjJR7rBtS2Rmq/NEcADg== +jest-haste-map@30.2.0: + version "30.2.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-30.2.0.tgz#808e3889f288603ac70ff0ac047598345a66022e" + integrity sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw== dependencies: - "@jest/types" "30.0.5" + "@jest/types" "30.2.0" "@types/node" "*" anymatch "^3.1.3" fb-watchman "^2.0.2" graceful-fs "^4.2.11" jest-regex-util "30.0.1" - jest-util "30.0.5" - jest-worker "30.1.0" + jest-util "30.2.0" + jest-worker "30.2.0" micromatch "^4.0.8" walker "^1.0.8" optionalDependencies: fsevents "^2.3.3" -jest-leak-detector@30.1.0: - version "30.1.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-30.1.0.tgz#8b86e7c5f1e3e4f2a32d930ec769103ad0985874" - integrity sha512-AoFvJzwxK+4KohH60vRuHaqXfWmeBATFZpzpmzNmYTtmRMiyGPVhkXpBqxUQunw+dQB48bDf4NpUs6ivVbRv1g== +jest-leak-detector@30.2.0: + version "30.2.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-30.2.0.tgz#292fdca7b7c9cf594e1e570ace140b01d8beb736" + integrity sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ== dependencies: "@jest/get-type" "30.1.0" - pretty-format "30.0.5" + pretty-format "30.2.0" -jest-matcher-utils@30.1.2: - version "30.1.2" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-30.1.2.tgz#3f1b63949f740025aff740c6c6a1b653ae370fbb" - integrity sha512-7ai16hy4rSbDjvPTuUhuV8nyPBd6EX34HkBsBcBX2lENCuAQ0qKCPb/+lt8OSWUa9WWmGYLy41PrEzkwRwoGZQ== +jest-matcher-utils@30.2.0: + version "30.2.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz#69a0d4c271066559ec8b0d8174829adc3f23a783" + integrity sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg== dependencies: "@jest/get-type" "30.1.0" chalk "^4.1.2" - jest-diff "30.1.2" - pretty-format "30.0.5" + jest-diff "30.2.0" + pretty-format "30.2.0" -jest-message-util@30.1.0: - version "30.1.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-30.1.0.tgz#653a9bb1a33306eddf13455ce0666ba621b767c4" - integrity sha512-HizKDGG98cYkWmaLUHChq4iN+oCENohQLb7Z5guBPumYs+/etonmNFlg1Ps6yN9LTPyZn+M+b/9BbnHx3WTMDg== +jest-message-util@30.2.0: + version "30.2.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-30.2.0.tgz#fc97bf90d11f118b31e6131e2b67fc4f39f92152" + integrity sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw== dependencies: "@babel/code-frame" "^7.27.1" - "@jest/types" "30.0.5" + "@jest/types" "30.2.0" "@types/stack-utils" "^2.0.3" chalk "^4.1.2" graceful-fs "^4.2.11" micromatch "^4.0.8" - pretty-format "30.0.5" + pretty-format "30.2.0" slash "^3.0.0" stack-utils "^2.0.6" -jest-mock@30.0.5: - version "30.0.5" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-30.0.5.tgz#ef437e89212560dd395198115550085038570bdd" - integrity sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ== +jest-mock@30.2.0: + version "30.2.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-30.2.0.tgz#69f991614eeb4060189459d3584f710845bff45e" + integrity sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw== dependencies: - "@jest/types" "30.0.5" + "@jest/types" "30.2.0" "@types/node" "*" - jest-util "30.0.5" + jest-util "30.2.0" jest-pnp-resolver@^1.2.3: version "1.2.3" @@ -7136,157 +7136,157 @@ jest-regex-util@30.0.1: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-30.0.1.tgz#f17c1de3958b67dfe485354f5a10093298f2a49b" integrity sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA== -jest-resolve-dependencies@30.1.3: - version "30.1.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-30.1.3.tgz#04bbe95c9f4af51046dde940698d7121b49d0167" - integrity sha512-DNfq3WGmuRyHRHfEet+Zm3QOmVFtIarUOQHHryKPc0YL9ROfgWZxl4+aZq/VAzok2SS3gZdniP+dO4zgo59hBg== +jest-resolve-dependencies@30.2.0: + version "30.2.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-30.2.0.tgz#3370e2c0b49cc560f6a7e8ec3a59dd99525e1a55" + integrity sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w== dependencies: jest-regex-util "30.0.1" - jest-snapshot "30.1.2" + jest-snapshot "30.2.0" -jest-resolve@30.1.3: - version "30.1.3" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-30.1.3.tgz#cc1019b28374ca7bcf7e58d57a4300449f390ec5" - integrity sha512-DI4PtTqzw9GwELFS41sdMK32Ajp3XZQ8iygeDMWkxlRhm7uUTOFSZFVZABFuxr0jvspn8MAYy54NxZCsuCTSOw== +jest-resolve@30.2.0: + version "30.2.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-30.2.0.tgz#2e2009cbd61e8f1f003355d5ec87225412cebcd7" + integrity sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A== dependencies: chalk "^4.1.2" graceful-fs "^4.2.11" - jest-haste-map "30.1.0" + jest-haste-map "30.2.0" jest-pnp-resolver "^1.2.3" - jest-util "30.0.5" - jest-validate "30.1.0" + jest-util "30.2.0" + jest-validate "30.2.0" slash "^3.0.0" unrs-resolver "^1.7.11" -jest-runner@30.1.3: - version "30.1.3" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-30.1.3.tgz#3253a0faab8f404aa9e0010911e8acbaf220865b" - integrity sha512-dd1ORcxQraW44Uz029TtXj85W11yvLpDuIzNOlofrC8GN+SgDlgY4BvyxJiVeuabA1t6idjNbX59jLd2oplOGQ== +jest-runner@30.2.0: + version "30.2.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-30.2.0.tgz#c62b4c3130afa661789705e13a07bdbcec26a114" + integrity sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ== dependencies: - "@jest/console" "30.1.2" - "@jest/environment" "30.1.2" - "@jest/test-result" "30.1.3" - "@jest/transform" "30.1.2" - "@jest/types" "30.0.5" + "@jest/console" "30.2.0" + "@jest/environment" "30.2.0" + "@jest/test-result" "30.2.0" + "@jest/transform" "30.2.0" + "@jest/types" "30.2.0" "@types/node" "*" chalk "^4.1.2" emittery "^0.13.1" exit-x "^0.2.2" graceful-fs "^4.2.11" - jest-docblock "30.0.1" - jest-environment-node "30.1.2" - jest-haste-map "30.1.0" - jest-leak-detector "30.1.0" - jest-message-util "30.1.0" - jest-resolve "30.1.3" - jest-runtime "30.1.3" - jest-util "30.0.5" - jest-watcher "30.1.3" - jest-worker "30.1.0" + jest-docblock "30.2.0" + jest-environment-node "30.2.0" + jest-haste-map "30.2.0" + jest-leak-detector "30.2.0" + jest-message-util "30.2.0" + jest-resolve "30.2.0" + jest-runtime "30.2.0" + jest-util "30.2.0" + jest-watcher "30.2.0" + jest-worker "30.2.0" p-limit "^3.1.0" source-map-support "0.5.13" -jest-runtime@30.1.3: - version "30.1.3" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-30.1.3.tgz#bca7cb48d53c5b5ae21399e7a65e21271f500004" - integrity sha512-WS8xgjuNSphdIGnleQcJ3AKE4tBKOVP+tKhCD0u+Tb2sBmsU8DxfbBpZX7//+XOz81zVs4eFpJQwBNji2Y07DA== +jest-runtime@30.2.0: + version "30.2.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-30.2.0.tgz#395ea792cde048db1b0cd1a92dc9cb9f1921bf8a" + integrity sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg== dependencies: - "@jest/environment" "30.1.2" - "@jest/fake-timers" "30.1.2" - "@jest/globals" "30.1.2" + "@jest/environment" "30.2.0" + "@jest/fake-timers" "30.2.0" + "@jest/globals" "30.2.0" "@jest/source-map" "30.0.1" - "@jest/test-result" "30.1.3" - "@jest/transform" "30.1.2" - "@jest/types" "30.0.5" + "@jest/test-result" "30.2.0" + "@jest/transform" "30.2.0" + "@jest/types" "30.2.0" "@types/node" "*" chalk "^4.1.2" cjs-module-lexer "^2.1.0" collect-v8-coverage "^1.0.2" glob "^10.3.10" graceful-fs "^4.2.11" - jest-haste-map "30.1.0" - jest-message-util "30.1.0" - jest-mock "30.0.5" + jest-haste-map "30.2.0" + jest-message-util "30.2.0" + jest-mock "30.2.0" jest-regex-util "30.0.1" - jest-resolve "30.1.3" - jest-snapshot "30.1.2" - jest-util "30.0.5" + jest-resolve "30.2.0" + jest-snapshot "30.2.0" + jest-util "30.2.0" slash "^3.0.0" strip-bom "^4.0.0" -jest-snapshot@30.1.2: - version "30.1.2" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-30.1.2.tgz#4001a94d8394bb077a1c96246f0107c81aba4f12" - integrity sha512-4q4+6+1c8B6Cy5pGgFvjDy/Pa6VYRiGu0yQafKkJ9u6wQx4G5PqI2QR6nxTl43yy7IWsINwz6oT4o6tD12a8Dg== +jest-snapshot@30.2.0: + version "30.2.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-30.2.0.tgz#266fbbb4b95fc4665ce6f32f1f38eeb39f4e26d0" + integrity sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA== dependencies: "@babel/core" "^7.27.4" "@babel/generator" "^7.27.5" "@babel/plugin-syntax-jsx" "^7.27.1" "@babel/plugin-syntax-typescript" "^7.27.1" "@babel/types" "^7.27.3" - "@jest/expect-utils" "30.1.2" + "@jest/expect-utils" "30.2.0" "@jest/get-type" "30.1.0" - "@jest/snapshot-utils" "30.1.2" - "@jest/transform" "30.1.2" - "@jest/types" "30.0.5" - babel-preset-current-node-syntax "^1.1.0" + "@jest/snapshot-utils" "30.2.0" + "@jest/transform" "30.2.0" + "@jest/types" "30.2.0" + babel-preset-current-node-syntax "^1.2.0" chalk "^4.1.2" - expect "30.1.2" + expect "30.2.0" graceful-fs "^4.2.11" - jest-diff "30.1.2" - jest-matcher-utils "30.1.2" - jest-message-util "30.1.0" - jest-util "30.0.5" - pretty-format "30.0.5" + jest-diff "30.2.0" + jest-matcher-utils "30.2.0" + jest-message-util "30.2.0" + jest-util "30.2.0" + pretty-format "30.2.0" semver "^7.7.2" synckit "^0.11.8" -jest-util@30.0.5: - version "30.0.5" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-30.0.5.tgz#035d380c660ad5f1748dff71c4105338e05f8669" - integrity sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g== +jest-util@30.2.0: + version "30.2.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-30.2.0.tgz#5142adbcad6f4e53c2776c067a4db3c14f913705" + integrity sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA== dependencies: - "@jest/types" "30.0.5" + "@jest/types" "30.2.0" "@types/node" "*" chalk "^4.1.2" ci-info "^4.2.0" graceful-fs "^4.2.11" picomatch "^4.0.2" -jest-validate@30.1.0: - version "30.1.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-30.1.0.tgz#585aae6c9ee1ac138dbacbece8a7838ca7773e60" - integrity sha512-7P3ZlCFW/vhfQ8pE7zW6Oi4EzvuB4sgR72Q1INfW9m0FGo0GADYlPwIkf4CyPq7wq85g+kPMtPOHNAdWHeBOaA== +jest-validate@30.2.0: + version "30.2.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-30.2.0.tgz#273eaaed4c0963b934b5b31e96289edda6e0a2ef" + integrity sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw== dependencies: "@jest/get-type" "30.1.0" - "@jest/types" "30.0.5" + "@jest/types" "30.2.0" camelcase "^6.3.0" chalk "^4.1.2" leven "^3.1.0" - pretty-format "30.0.5" + pretty-format "30.2.0" -jest-watcher@30.1.3: - version "30.1.3" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-30.1.3.tgz#2f381da5c2c76a46c46ba2108e6607c585421dc0" - integrity sha512-6jQUZCP1BTL2gvG9E4YF06Ytq4yMb4If6YoQGRR6PpjtqOXSP3sKe2kqwB6SQ+H9DezOfZaSLnmka1NtGm3fCQ== +jest-watcher@30.2.0: + version "30.2.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-30.2.0.tgz#f9c055de48e18c979e7756a3917e596e2d69b07b" + integrity sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg== dependencies: - "@jest/test-result" "30.1.3" - "@jest/types" "30.0.5" + "@jest/test-result" "30.2.0" + "@jest/types" "30.2.0" "@types/node" "*" ansi-escapes "^4.3.2" chalk "^4.1.2" emittery "^0.13.1" - jest-util "30.0.5" + jest-util "30.2.0" string-length "^4.0.2" -jest-worker@30.1.0: - version "30.1.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-30.1.0.tgz#a89c36772be449d4bdb60697fb695a1673b12ac2" - integrity sha512-uvWcSjlwAAgIu133Tt77A05H7RIk3Ho8tZL50bQM2AkvLdluw9NG48lRCl3Dt+MOH719n/0nnb5YxUwcuJiKRA== +jest-worker@30.2.0: + version "30.2.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-30.2.0.tgz#fd5c2a36ff6058ec8f74366ec89538cc99539d26" + integrity sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g== dependencies: "@types/node" "*" "@ungap/structured-clone" "^1.3.0" - jest-util "30.0.5" + jest-util "30.2.0" merge-stream "^2.0.0" supports-color "^8.1.1" @@ -7299,15 +7299,15 @@ jest-worker@^27.4.5: merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^30.1.3: - version "30.1.3" - resolved "https://registry.yarnpkg.com/jest/-/jest-30.1.3.tgz#c962290f65c32d44a0624f785b2d780835525a23" - integrity sha512-Ry+p2+NLk6u8Agh5yVqELfUJvRfV51hhVBRIB5yZPY7mU0DGBmOuFG5GebZbMbm86cdQNK0fhJuDX8/1YorISQ== +jest@^30.2.0: + version "30.2.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-30.2.0.tgz#9f0a71e734af968f26952b5ae4b724af82681630" + integrity sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A== dependencies: - "@jest/core" "30.1.3" - "@jest/types" "30.0.5" + "@jest/core" "30.2.0" + "@jest/types" "30.2.0" import-local "^3.2.0" - jest-cli "30.1.3" + jest-cli "30.2.0" jiti@^2.5.1: version "2.5.1" @@ -9016,10 +9016,10 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= -node-releases@^2.0.19: - version "2.0.19" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" - integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== +node-releases@^2.0.21: + version "2.0.21" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.21.tgz#f59b018bc0048044be2d4c4c04e4c8b18160894c" + integrity sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw== nopt@^2.2.0: version "2.2.1" @@ -9286,11 +9286,6 @@ optionator@^0.9.3: prelude-ls "^1.2.1" type-check "^0.4.0" -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - own-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" @@ -9494,25 +9489,24 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" -patch-package@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-8.0.0.tgz#d191e2f1b6e06a4624a0116bcb88edd6714ede61" - integrity sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA== +patch-package@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-8.0.1.tgz#79d02f953f711e06d1f8949c8a13e5d3d7ba1a60" + integrity sha512-VsKRIA8f5uqHQ7NGhwIna6Bx6D9s/1iXlA1hthBVBEbkq+t4kXD0HHt+rJhf/Z+Ci0F/HCB2hvn0qLdLG+Qxlw== dependencies: "@yarnpkg/lockfile" "^1.1.0" chalk "^4.1.2" ci-info "^3.7.0" cross-spawn "^7.0.3" find-yarn-workspace-root "^2.0.0" - fs-extra "^9.0.0" + fs-extra "^10.0.0" json-stable-stringify "^1.0.2" klaw-sync "^6.0.0" minimist "^1.2.6" open "^7.4.2" - rimraf "^2.6.3" semver "^7.5.3" slash "^2.0.0" - tmp "^0.0.33" + tmp "^0.2.4" yaml "^2.2.2" path-exists@^3.0.0: @@ -9965,10 +9959,10 @@ pretty-error@^4.0.0: lodash "^4.17.20" renderkid "^3.0.0" -pretty-format@30.0.5, pretty-format@^30.0.0: - version "30.0.5" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-30.0.5.tgz#e001649d472800396c1209684483e18a4d250360" - integrity sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw== +pretty-format@30.2.0, pretty-format@^30.0.0: + version "30.2.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-30.2.0.tgz#2d44fe6134529aed18506f6d11509d8a62775ebe" + integrity sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA== dependencies: "@jest/schemas" "30.0.5" ansi-styles "^5.2.0" @@ -10103,10 +10097,10 @@ qs@6.13.0, qs@^6.12.3, qs@^6.5.2: dependencies: side-channel "^1.0.6" -query-string@*, query-string@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-9.2.2.tgz#a0104824edfdd2c1db2f18af71cef7abf6a3b20f" - integrity sha512-pDSIZJ9sFuOp6VnD+5IkakSVf+rICAuuU88Hcsr6AKL0QtxSIfVuKiVP2oahFI7tk3CRSexwV+Ya6MOoTxzg9g== +query-string@*, query-string@^9.3.1: + version "9.3.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-9.3.1.tgz#d0c93e6c7fb7c17bdf04aa09e382114580ede270" + integrity sha512-5fBfMOcDi5SA9qj5jZhWAcTtDfKF5WFdd2uD9nVNlbxVv1baq65aALy6qofpNEGELHvisjjasxQp7BlM9gvMzw== dependencies: decode-uri-component "^0.4.1" filter-obj "^5.1.0" @@ -10707,13 +10701,6 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== -rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - rimraf@^5.0.10: version "5.0.10" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.10.tgz#23b9843d3dc92db71f96e1a2ce92e39fd2a8221c" @@ -11539,10 +11526,10 @@ stylelint-config-recommended@^17.0.0: resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-17.0.0.tgz#4f77c70609b2d7093cc60bb48adfabdde434aa5d" integrity sha512-WaMSdEiPfZTSFVoYmJbxorJfA610O0tlYuU2aEwY33UQhSPgFbClrVJYWvy3jGJx+XW37O+LyNLiZOEXhKhJmA== -stylelint-config-standard@^39.0.0: - version "39.0.0" - resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-39.0.0.tgz#9635554a9c42e7e89dadc024afac372d18e3e776" - integrity sha512-JabShWORb8Bmc1A47ZyJstran60P3yUdI1zWMpGYPeFiC6xzHXJMkpKAd8EjIhq3HPUplIWWMDJ/xu0AiPd+kA== +stylelint-config-standard@^39.0.1: + version "39.0.1" + resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-39.0.1.tgz#dcd1c28400added09e566e85ffe8d480ae2531a2" + integrity sha512-b7Fja59EYHRNOTa3aXiuWnhUWXFU2Nfg6h61bLfAb5GS5fX3LMUD0U5t4S8N/4tpHQg3Acs2UVPR9jy2l1g/3A== dependencies: stylelint-config-recommended "^17.0.0" @@ -11554,25 +11541,25 @@ stylelint-order@^6.0.2: postcss "^8.4.32" postcss-sorting "^8.0.2" -stylelint@^16.23.1: - version "16.23.1" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.23.1.tgz#e5f5ee173adf989db0855b825e66f9ccdde3c78a" - integrity sha512-dNvDTsKV1U2YtiUDfe9d2gp902veFeo3ecCWdGlmLm2WFrAV0+L5LoOj/qHSBABQwMsZPJwfC4bf39mQm1S5zw== +stylelint@^16.25.0: + version "16.25.0" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.25.0.tgz#c3d602974f2a18fa57fadc9f3f40129b098fe4dc" + integrity sha512-Li0avYWV4nfv1zPbdnxLYBGq4z8DVZxbRgx4Kn6V+Uftz1rMoF1qiEI3oL4kgWqyYgCgs7gT5maHNZ82Gk03vQ== dependencies: "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" "@csstools/media-query-list-parser" "^4.0.3" "@csstools/selector-specificity" "^5.0.0" - "@dual-bundle/import-meta-resolve" "^4.1.0" + "@dual-bundle/import-meta-resolve" "^4.2.1" balanced-match "^2.0.0" colord "^2.9.3" cosmiconfig "^9.0.0" css-functions-list "^3.2.3" css-tree "^3.1.0" - debug "^4.4.1" + debug "^4.4.3" fast-glob "^3.3.3" fastest-levenshtein "^1.0.16" - file-entry-cache "^10.1.3" + file-entry-cache "^10.1.4" global-modules "^2.0.0" globby "^11.1.0" globjoin "^0.1.4" @@ -11697,10 +11684,10 @@ table@^6.9.0: string-width "^4.2.3" strip-ansi "^6.0.1" -tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +tapable@^2.0.0, tapable@^2.2.0, tapable@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.0.tgz#7e3ea6d5ca31ba8e078b560f0d83ce9a14aa8be6" + integrity sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg== teeny-request@7.1.1: version "7.1.1" @@ -11804,12 +11791,10 @@ tldts@^6.1.32: dependencies: tldts-core "^6.1.86" -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" +tmp@^0.2.4: + version "0.2.5" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.5.tgz#b06bcd23f0f3c8357b426891726d16015abfd8f8" + integrity sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow== tmpl@1.0.5: version "1.0.5" @@ -12024,10 +12009,10 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript@^5.8.3: - version "5.9.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.2.tgz#d93450cddec5154a2d5cabe3b8102b83316fb2a6" - integrity sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A== +typescript@^5.9.3: + version "5.9.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" + integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== typical@^5.0.0, typical@^5.2.0: version "5.2.0" @@ -12486,10 +12471,10 @@ walker@^1.0.8: dependencies: makeerror "1.0.12" -watchpack@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.1.tgz#29308f2cac150fa8e4c92f90e0ec954a9fed7fff" - integrity sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg== +watchpack@^2.4.4: + version "2.4.4" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.4.tgz#473bda72f0850453da6425081ea46fc0d7602947" + integrity sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" @@ -12613,10 +12598,10 @@ webpack-sources@^3.3.3: resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.3.3.tgz#d4bf7f9909675d7a070ff14d0ef2a4f3c982c723" integrity sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg== -webpack@^5.101.3: - version "5.101.3" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.101.3.tgz#3633b2375bb29ea4b06ffb1902734d977bc44346" - integrity sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A== +webpack@^5.102.0: + version "5.102.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.102.0.tgz#7a2416e6da356c35f1fb35333d2f5cee0133e953" + integrity sha512-hUtqAR3ZLVEYDEABdBioQCIqSoguHbFn1K7WlPPWSuXmx0031BD73PSE35jKyftdSh4YLDoQNgK4pqBt5Q82MA== dependencies: "@types/eslint-scope" "^3.7.7" "@types/estree" "^1.0.8" @@ -12626,7 +12611,7 @@ webpack@^5.101.3: "@webassemblyjs/wasm-parser" "^1.14.1" acorn "^8.15.0" acorn-import-phases "^1.0.3" - browserslist "^4.24.0" + browserslist "^4.24.5" chrome-trace-event "^1.0.2" enhanced-resolve "^5.17.3" es-module-lexer "^1.2.1" @@ -12639,9 +12624,9 @@ webpack@^5.101.3: mime-types "^2.1.27" neo-async "^2.6.2" schema-utils "^4.3.2" - tapable "^2.1.1" + tapable "^2.2.3" terser-webpack-plugin "^5.3.11" - watchpack "^2.4.1" + watchpack "^2.4.4" webpack-sources "^3.3.3" websocket-driver@>=0.5.1, websocket-driver@^0.7.4: